2012-05-16 45 views
28

我是shell腳本新手,我試圖從每行使用SED中刪除新行字符。這是我迄今爲止所做的:使用sed從傳入流中刪除新行字符

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' 

只刪除Ist新行字符。 我發現某處這個命令:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g' 

但它提供了:「BA:事件未找到」

,如果我這樣做:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g' 

然後它給正確的輸出,但我在尋找更好的東西,因爲我不知道有多少新的角色,當我運行該腳本,我會得到。傳入的流來自echo或printf或腳本中的某個變量。 在此先感謝

+0

的 '巴:事件未找到' 的錯誤是在你的shell。停止使用csh,或者逃離! –

+0

@WilliamPursell我必須使用csh只有我沒有其他選擇。你的建議我放棄了! 「printf」{new \ nto \ nlinux}「| sed':a; N; $ ba; s/\ n// g'」這個命令也沒有給出正確的結果..我知道有很多缺點csh,但必須使用它,由於一些強制:(..感謝 –

+0

你不能刪除的'!',但你需要在它之前與反斜槓 –

回答

64

要刪除換行符,使用TR:

tr -d '\n' 

如果你想用一個空格來代替每個換行:

tr '\n' ' ' 

錯誤ba: Event not found從CSH來了,是由於csh試圖在您的歷史記錄列表中匹配!ba。你可以逃脫!,寫命令:

sed ':a;N;$\!ba;s/\n/ /g' # Suitable for csh only!! 

但sed的是這個錯誤的工具,你會使用更合理的處理帶引號的字符串殼會更好。也就是說,停止使用csh並開始使用bash。

+0

感謝您的回覆,但我們可以使用tr來修改來自echo或printf的傳入流嗎? –

+1

tr是一個過濾器''printf ... | tr ...'可以正常工作 –

+0

不會的,即使使用'$ \!ba',結果是'ba:Event not found'來自csh腳本 – krb686

6

這可能會爲你工作:

printf "{new\nto\nlinux}" | paste -sd' '    
{new to linux} 

或:

printf "{new\nto\nlinux}" | tr '\n' ' '    
{new to linux} 

或:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g' 
{new to linux} 
+2

+1:粘貼使用不錯。請注意,由於(錯誤)引用規則,此處的sed解決方案不適用於csh,而'!'仍然必須逃脫。 –

+0

Yay粘貼。它表明它應該從標準輸入讀取:'​​paste -sd「」-' – Jelle

+0

tr -d「\ n」只留下stdin的最後一行..:/(在Mac上) –