如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
当前回答
要删除空行,请执行以下操作:
sed -n "s/^$//;t;p;"
其他回答
较短的锥子替代品:
awk 1 ORS=' '
解释
awk程序由由条件代码块组成的规则组成,即:
condition { code-block }
如果省略了代码块,则使用默认值:{print$0}。因此,1被解释为真条件,并且每行执行打印$0。
当awk读取输入时,它会根据RS(记录分隔符)的值将其拆分为记录,默认情况下是一个换行符,因此awk默认情况下将按行解析输入。拆分还涉及从输入记录中剥离RS。
现在,当打印记录时,ORS(输出记录分隔符)被附加到记录上,默认值也是一个换行符。因此,通过将ORS更改为空格,所有换行符都将更改为空格。
也可以使用此方法:
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并打印确切结果。
GNUsed有一个选项-z,用于空分隔记录(行)。您可以拨打:
sed -z 's/\n/ /g'
Perl版本以您预期的方式工作。
perl -i -p -e 's/\n//' file
正如评论中所指出的,值得注意的是,这些编辑是到位的-i.bak将在替换之前为您提供原始文件的备份,以防您的正则表达式没有您想象的那么聪明。
将此解决方案与GNU sed一起使用:
sed ':a;N;$!ba;s/\n/ /g' file
这将在循环中读取整个文件(':a;N;$!ba),然后用空格(s/\N//g)替换换行符。如果需要,可以简单地附加其他替换。
说明:
sed首先将除换行外的第一行读取到模式空间中。通过:a创建标签。通过N将新行和下一行附加到图案空间。如果我们在最后一行之前,请分支到创建的标签$!ba($!表示不在最后一行执行此操作。这是避免再次执行N所必需的,如果没有更多输入,则会终止脚本!)。最后,替换用模式空间(即整个文件)上的空格替换每一个换行符。
以下是与BSD和OS X的sed兼容的跨平台语法(根据@Benjie评论):
sed -e ':a' -e 'N' -e '$!ba' -e 's/\n/ /g' file
正如您所看到的,使用sed解决这个简单的问题是有问题的。要获得更简单和充分的解决方案,请参阅以下答案。