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

风流意气都作罢 提交于 2019-12-09 17:36:06

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

我尝试失败:

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

我如何解决它?


#1楼

sed旨在用于基于行的输入。 虽然它可以满足您的需求。


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

tr '\n' ' ' < input_filename

或完全删除换行符:

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

或您是否拥有GNU版本(及其长选项)

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

#2楼

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

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

正如评论中指出的那样,值得注意的是此编辑已就位。 -i.bak会在替换前为您提供原始文件的备份,以防您的正则表达式不如您想象的那样聪明。


#3楼

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

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

来自man sed

[2addr] N

使用嵌入的换行符将输入的下一行追加到模式空间,以将附加的材料与原始内容分开。 请注意,当前行号会更改。

用它来搜索(多个)格式错误的日志文件,其中搜索字符串可能在“孤立的”下一行中找到。


#4楼

将此解决方案与GNU sed

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

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

说明:

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

这是与BSD和OS X的sed兼容的跨平台兼容语法(根据@Benjie comment ):

sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file

如您所见,将sed用于本来很简单的问题是有问题的。 有关更简单和适当的解决方案,请参见此答案


#5楼

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

dos2unix yourfile yourfile
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!