OSX上的sed有一些怪癖。该资源(http://nlfiedler.github.io/2010/12/05/newlines-in-sed-on-mac.html)包含有关如何空格转换成一个换行符信息:OSX sed换行符 - 为什么将空格转换为换行符,但换行符不会转换为空格
echo 'foo bar baz quux' | sed -e 's/ /\'$'\n/g'
OR(@ ghoti的建议,这也使其更易于阅读):
echo 'foo bar baz quux' | sed -e $'s/ /\\\n/g'
然而,当我尝试反向 - 换行转换到空白,这是行不通的:
echo -e "foo\nbar" | sed -e 's/\'$'\n/ /g'
的只是改变\n
更简单的方法行不通eithe R:
echo -e "foo\nbar" | sed -e 's/\n/ /g'
有一个相关的答案在这里:https://superuser.com/questions/307165/newlines-in-sed-on-mac-os-x,由斯皮夫了详细的解答(右页面结束),但是应用相同的逻辑并没有解决问题。
这里是一个没有在OSX工作(通过http://www.benjiegillam.com/2011/09/using-sed-to-replace-newlines/)的方式:
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g'
不过,我仍然好奇,为什么扭转了原来的做法是行不通的。
更新:这里是如何使它与两行的工作(该解决方案是使用N
嵌入换行符):
echo -e "foo\nbar\n" | sed -e 'N;s/\n/ /g'
的替代解决方案(见@ghoti详细解释完整的答案) :
echo -e "foo\nbar\n" | sed -n '1h;2,$H;${;x;s/\n/ /gp;}'
然而,这种解决方案似乎是一点点慢于一个问题中陈述建议(这些命令的事项记顺序,因此它可能是有意义的尝试以不同的顺序测试它们):
time seq 10000 | sed -n '1h;2,$H;${;x;s/\n/ /gp;}' > /dev/null
time seq 10000 | sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' > /dev/null
用三行输入尝试更新的解决方案。并查看下面的答案。 :) – ghoti
另外,如果你没有看到这个,你的第一个例子''/'\'''\ n/g''实际上依赖于shell扩展。 (请查看友好的邻居bash手册页的QUOTING部分。)它将在bash和其他一些shell中工作,但不是通用的(或POSIX)。您可以通过对整个表达式使用相同的引用样式来使其更清晰或更易于阅读:'sed -e $'s// \\\ n/g''。 – ghoti