44

我是 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 或脚本中的某个变量。提前致谢

4

3 回答 3

99

要删除换行符,请使用 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。

于 2012-05-16T12:45:49.387 回答
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}
于 2012-05-16T12:59:48.470 回答
0

使用 perl 而不是 sed。perl 类似于 sed:

ubuntu@ubuntu:/$ printf "{new\nto\nlinux}" | sed 's/\n/ /g'; echo ''
{new
to
linux}
ubuntu@ubuntu:/$ printf "{new\nto\nlinux}" | perl -pe 's/\n/ /g'; echo ''
{new to linux}
ubuntu@ubuntu:/$ echo -e "new\nto\nlinux\ntest\n1\n2 3" | perl -pe 's/\n/_ _/g'; echo ''
new_ _to_ _linux_ _test_ _1_ _2 3_ _
ubuntu@ubuntu:/$
于 2022-02-08T05:07:33.980 回答