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

我尝试过:

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

如何修复?


当前回答

还有一种选择:

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

其中tr-s表示:

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

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

其他回答

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

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

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

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


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

tr '\n' ' ' < input_filename

或完全删除换行符:

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

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

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

以前的大多数sed命令示例在我的Unix系统中都不适用,并给出错误消息:

Label too long: {:q;N;s/\n/ /g;t q}

这适用于所有Unix/Linux环境:

line=$(while read line; do echo -n "$line "; done < yoursourcefile.txt)
echo $line |sed 's/ //g' > sortedoutput.txt

第一行将从文件yoursourcefile.txt中删除所有新行,并生成一行。第二个sed命令将删除其中的所有空格。

也可以使用此方法:

sed 'x;G;1!h;s/\n/ /g;$!d'

解释

x   - which is used to exchange the data from both space (pattern and hold).
G   - which is used to append the data from hold space to pattern space.
h   - which is used to copy the pattern space to hold space.
1!h - During first line won't copy pattern space to hold space due to \n is
      available in pattern space.
$!d - Clear the pattern space every time before getting the next line until the
      the last line.

Flow

当第一行从输入中获取时,进行交换,因此1进入保留空间,\n进入模式空间,将保留空间附加到模式空间,执行替换并删除模式空间。

在第二行中,进行交换,2到保持空间,1到模式空间,G将保持空间附加到模式空间中,h将模式复制到其中,进行替换并删除。此操作将继续,直到达到EOF并打印确切结果。

以下内容比大多数答案简单得多。此外,它还在发挥作用:

echo `sed -e 's/$/\ |\ /g' file`