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

我尝试过:

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

如何修复?


当前回答

在某些情况下,您可以将RS更改为其他字符串或字符。这样,\n可用于sub/gsub:

$ gawk 'BEGIN {RS="dn" } {gsub("\n"," ") ;print $0 }' file

shell脚本的强大之处在于,如果您不知道如何以一种方式执行,您可以用另一种方式来执行。很多时候,你要考虑的事情比简单问题的复杂解决方案要多。

关于呆呆的事情。。。并将文件读入内存,我不知道这一点,但对我来说,gawk似乎一次只能使用一行,而且速度非常快(没有其他一些快,但编写和测试的时间也很重要)。

我处理MB甚至GB的数据,我发现的唯一限制是行大小。

其他回答

谁需要sed?以下是bash方式:

cat test.txt |  while read line; do echo -n "$line "; done

易于理解的解决方案

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

sed旨在用于基于行的输入。尽管它可以满足你的需要。


这里更好的选择是使用tr命令,如下所示:

tr '\n' ' ' < input_filename

或完全删除换行符:

tr -d '\n' < input.txt > output.txt

或者如果您有GNU版本(带有长选项)

tr --delete '\n' < input.txt > output.txt

这可能适用于您(GNU sed):

sed 'H;$!d;x;:a;s/^((.).*)\2/\1 /;ta;s/.//' file

H命令在模式空间前面加一个换行符,然后将结果附加到保留空间。sed的正常流程是从每一行中删除以下换行符,因此这将在保留空间的开头引入一个换行符,并复制文件的其余部分。一旦文件被拖入保留空间,就用模式空间替换保留空间,然后使用模式匹配将所有原始换行替换为空格。最后,删除引入的换行符。

这样做的优点是,在sed命令中永远不会实际输入换行字符串。

备选方案:

sed 'H;$!d;x;y/\n/ /;s/.//' file

Or:

sed 'H;1h;$!d;x;y/\n/ /' file

Perl版本以您预期的方式工作。

perl -i -p -e 's/\n//' file

正如评论中所指出的,值得注意的是,这些编辑是到位的-i.bak将在替换之前为您提供原始文件的备份,以防您的正则表达式没有您想象的那么聪明。