如何使用sed命令将换行符(“\n”)替换为空格(“”)?

我尝试过:

sed 's#\n# #g' file
sed 's#^$# #g' file

如何修复?


当前回答

是sed在“正常”替换之后引入了新的行。首先,它修剪新行字符,然后根据您的指示进行处理,然后引入新行。

使用sed,您可以为每个输入行用您选择的字符串替换修剪后的行(而不是新行字符)的“结尾”;但是,sed将输出不同的行。例如,假设您希望将“行尾”替换为“==”(比用单个空格替换更通用):

PROMPT~$ cat <<EOF |sed 's/$/===/g'
first line
second line
3rd line
EOF

first line===
second line===
3rd line===
PROMPT~$

要用字符串替换新行字符,可以低效地使用tr,如前所述,用“特殊字符”替换换行字符,然后使用sed用所需的字符串替换该特殊字符。

例如:

PROMPT~$ cat <<EOF | tr '\n' $'\x01'|sed -e 's/\x01/===/g'
first line
second line
3rd line
EOF

first line===second line===3rd line===PROMPT~$

其他回答

这真的很简单。。。当我找到解决办法时,我真的很生气。又少了一个反斜杠。这就是:

sed -i "s/\\\\\n//g" filename
sed '1h;1!H;$!d
     x;s/\n/ /g' YourFile

这不适用于巨大的文件(缓冲区限制),但如果有足够的内存来保存文件,则非常有效。(更正H->1h;在@hilojack的好话之后1!H)

另一个在读取时更改新行的版本(更多的cpu,更少的内存)

 sed ':loop
 $! N
 s/\n/ /
 t loop' YourFile

另一种GNU sed方法,几乎与Zsolt Botykai的答案相同,但这使用了sed不太常用的y(音译)命令,这节省了一个字节的代码(后面的g):

sed ':a;N;$!ba;y/\n/ /'

人们可能希望y的运行速度比s快(也许以tr的速度,快20倍),但在GNU sed v4.2.2中,y比s慢4%左右。


更便携的BSD sed版本:

sed -e ':a' -e 'N;$!ba' -e 'y/\n/ /'

这里是没有缓冲区的sed(适用于实时输出)。示例:在HTML中用<br/>break替换\n

echo -e "1\n2\n3" | sed 's/.*$/&<br\/>/'

我不是专家,但我想在sed中,您首先需要将下一行追加到模式空间中,bij使用“N”。摘自《sed&awk》(Dale Dougherty and Arnold Robbins;O'Reilly 1997;预览版第107页)一书“高级sed命令”中的“多行模式空间”一节:

多行Next(N)命令通过读取新的输入行并将其附加到阵列空间的内容来创建多行阵列空间。模式空间的原始内容和新的输入行由换行分隔。嵌入的换行符可以通过转义序列“\n”进行模式匹配。在多行模式空间中,元字符“^”匹配模式空间的第一个字符,而不是任何嵌入换行符后面的字符。类似地,“$”只匹配模式空间中的最后一个换行符,而不匹配任何嵌入的换行符。执行Next命令后,控制权将传递给脚本中的后续命令。

发件人:

[2地址]N将下一行输入附加到模式空间,使用嵌入的换行符将附加的材料与原始内容分开。请注意,当前行号已更改。

我用它搜索了(多个)格式不正确的日志文件,其中搜索字符串可以在“孤立”的下一行找到。