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

我尝试过:

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

如何修复?


当前回答

cat file | xargs

为了完整起见

其他回答

用任何字符串替换换行符,并替换最后一个换行符

纯tr解决方案只能替换为单个字符,纯sed解决方案不能替换输入的最后一行。以下解决方案解决了这些问题,并且似乎对二进制数据是安全的(即使使用UTF-8语言环境):

printf '1\n2\n3\n' |
  sed 's/%/%p/g;s/@/%a/g' | tr '\n' @ | sed 's/@/<br>/g;s/%a/@/g;s/%p/%/g'

结果:

1<br>2<br>3<br>

易于理解的解决方案

我有这个问题。最重要的是,我需要在BSD(Mac OS X)和GNU(Linux和Cygwin)sed和tr上工作的解决方案:

$ echo 'foo
bar
baz


foo2
bar2
baz2' \
| tr '\n' '\000' \
| sed 's:\x00\x00.*:\n:g' \
| tr '\000' '\n'

输出:

foo
bar
baz

(后面有换行符)

它可以在Linux、OS X和BSD上运行,即使没有UTF-8支持或使用蹩脚的终端。

使用tr将换行符与另一个字符交换。NULL(\000或\x00)很好,因为它不需要UTF-8支持,也不太可能被使用。使用sed匹配NULL如果需要,使用tr交换回额外的换行符

为了使用awk将所有换行符替换为空格,而不将整个文件读入内存:

awk '{printf "%s ", $0}' inputfile

如果需要最后一行换行符:

awk '{printf "%s ", $0} END {printf "\n"}' inputfile

可以使用空格以外的字符:

awk '{printf "%s|", $0} END {printf "\n"}' inputfile

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

sed -i "s/\\\\\n//g" filename

另一种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/ /'