如何将换行符(“ \\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
这将循环读取整个文件,然后用空格替换换行符。
说明:
- 通过
:a
创建标签。 - 通过
N
将当前行和下一行添加到模式空间。 - 如果我们在最后一行之前,则转到创建的标签
$!ba
($!
表示不要在最后一行上这样做,因为应该有最后一个换行符)。 - 最后,替换将每个换行符替换为模式空间上的空格(即整个文件)。
这是与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
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3139307