unix - sed如何替换换行符(\n)?

如何使用sed替换换行符(n)?

尝试这个失败了:


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

时间:

在sed中使用此解决方案:


sed ':a;N;$!ba;s/n/ /g'

这将在一个循环中读取整个文件,然后用空格替换换行。

说明。

  1. 通过:a创建标签
  2. 通过N将当前和下一行附加到模式空间
  3. 如果我们在最后一行之前,分支到创建的标签$ba ($意味着不要在最后一行上做(因为应该有最后一个换行符))),!
  4. 最后替换用模式空间(这是整个文件)上的空格替换每个换行符。

使用tr


tr 'n' ' ' < input_filename

快速回答:


sed ':a;N;$!ba;s/n/ /g' file

  1. :创建标签'"'
  2. N将下一行附加到模式空间
  3. 如果不是最后一行,则$分支(转到)标签"a"',!
  4. 正规表达式替代/n/为新行,/ /空格,/g全局匹配,


替代选项:

使用bash,慢


while read line; do printf"%s""$line"; done < file

使用perl,和sed 速度一样


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

使用tr,比sed快,只能替换一个字符


tr 'n' ' ' < file

使用paste ,和tr速度一样,只能替换一个字符,


paste -s -d ' ' file

使用awk,和tr速度一样


awk 1 ORS=' ' file











在此类情况下不添加换行符。 因此,脚本


 sed 's/n//' file # to delete newlines from each line 
 sed 's/n/foon/' file # to add a word to the end of each line 


要执行上述任务,
请使用以下脚本之一:


 tr -d 'n' < file # use tr to delete newlines 
 sed ':a;N;$!ba;s/n//g' file # GNU sed to delete newlines 
 sed 's/$/ foo/' file # add"foo" to end of each line 

因为GNU之外的其他版本限制了
模式缓冲区,在这里是首选的Unix'tr'实用程序,















自从GNU sed
版本3.02.80现在支持此语法:


 sed '/start/,+4d' # to delete"start" plus the next 4 lines, 


更短的awk替代选项:


awk 1 ORS=' '

{ print $0 }


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


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

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


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

如果你想要最后一个换行符:


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

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


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


tr 'n' ' ' 

简单易用。

...