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

我尝试过:

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

如何修复?


当前回答

您可以使用xargs-默认情况下,它将用空格替换\n。

但是,如果您的输入有任何未终止的引号,例如给定行上的引号符号不匹配,则会出现问题。

其他回答

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

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

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

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

发件人:

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

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

易于理解的解决方案

我有这个问题。最重要的是,我需要在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交换回额外的换行符

也可以使用标准文本编辑器:

printf '%s\n' '%s/$/ /' '%j' 'w' | ed -s file

注意:这会将结果保存回文件。

与这里的大多数sed答案一样,此解决方案的缺点是必须首先将整个文件加载到内存中。

我使用了一种混合方法,通过使用tr用制表符替换换行符,然后用我想要的任何内容替换制表符,来绕过换行符的问题。在本例中,“”,因为我试图生成HTML分隔符。

echo -e "a\nb\nc\n" |tr '\n' '\t' | sed 's/\t/ <br> /g'`