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

我尝试过:

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

如何修复?


当前回答

@OP,如果您想替换文件中的换行符,可以只使用dos2unix(或unix2dox)

dos2unix yourfile yourfile

其他回答

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


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

tr '\n' ' ' < input_filename

或完全删除换行符:

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

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

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

还有一种选择:

tr-s“[:space:]”“”<filename>filename2&&mv filename2文件名

其中tr-s表示:

-s、 --挤压重复替换重复字符的每个序列其列在最后指定的SET中,只出现一次该字符

这将使用单个空格替换文件中的所有空格序列,将结果写入新文件,然后将新文件重命名为原始名称。

这可能适用于您(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

试试看:

echo "a,b"|sed 's/,/\r\n/'

我特别喜欢的解决方案是在保留空间中追加所有文件,并替换文件末尾的所有换行符:

$ (echo foo; echo bar) | sed -n 'H;${x;s/\n//g;p;}'
foobar

然而,有人告诉我,在一些sed实现中,保持空间可能是有限的。