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

nav*_*jan 35 shell csh sed

我是shell脚本的新手,我试图使用SED从每一行中删除新的行字符.这是我到目前为止所做的:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g'
Run Code Online (Sandbox Code Playgroud)

仅删除Ist新行字符.我找到了这个命令:

printf "{new\nto\nlinux}" | sed ':a;N;$!ba;s/\n/ /g'
Run Code Online (Sandbox Code Playgroud)

但它给出了:"ba:未找到事件."

如果我做:

printf "{new\nto\nlinux}" | sed ':a;N;s/\n/ /g' | sed ':a;N;s/\n/ /g'
Run Code Online (Sandbox Code Playgroud)

然后它提供正确的输出,但我正在寻找更好的东西,因为我不知道当我运行脚本时我会得到多少新角色.传入流来自echo或printf或脚本中的某些变量.提前致谢

Wil*_*ell 83

要删除换行符,请使用tr:

tr -d '\n'
Run Code Online (Sandbox Code Playgroud)

如果要用单个空格替换每个换行符:

tr '\n' ' '
Run Code Online (Sandbox Code Playgroud)

该错误ba: Event not found来自csh,是由于csh尝试匹配!ba您的历史记录列表.您可以转义!并编写命令:

sed ':a;N;$\!ba;s/\n/ /g'  # Suitable for csh only!!
Run Code Online (Sandbox Code Playgroud)

但是sed是错误的工具,你最好使用一个更合理地处理引用字符串的shell.也就是说,停止使用csh并开始使用bash.


pot*_*ong 6

这可能对你有用:

printf "{new\nto\nlinux}" | paste -sd' '            
{new to linux}
Run Code Online (Sandbox Code Playgroud)

要么:

printf "{new\nto\nlinux}" | tr '\n' ' '            
{new to linux}
Run Code Online (Sandbox Code Playgroud)

要么:

printf "{new\nto\nlinux}" |sed -e ':a' -e '$!{' -e 'N' -e 'ba' -e '}' -e 's/\n/ /g'
{new to linux}
Run Code Online (Sandbox Code Playgroud)

  • +1:粘贴效果不错.请注意,由于(错误的)引用规则,这里的sed解决方案不能用于csh,并且`!`仍然必须被转义. (2认同)