使用sed从传入流中删除换行符

时间:2012-05-16 12:43:26

标签: shell sed csh

我是shell脚本的新手,我正在尝试使用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或脚本中的某些变量。 提前致谢

2 个答案:

答案 0 :(得分:76)

要删除换行符,请使用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是错误的工具,你最好使用一个更合理地处理引用字符串的shell。也就是说,停止使用csh并开始使用bash。

答案 1 :(得分: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}