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