如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
如何使用sed命令将换行符(“\n”)替换为空格(“”)?
我尝试过:
sed 's#\n# #g' file
sed 's#^$# #g' file
如何修复?
当前回答
三件事。
tr(或cat等)是绝对不需要的。(GNU)sed和(GNU)awk结合在一起,可以完成99.9%的文本处理。流!=基于行。ed是一个基于行的编辑器。sed不是。有关差异的更多信息,请参阅sed讲座。大多数人将sed误认为是基于行的,因为默认情况下,它对SIMPLE匹配的模式匹配并不十分贪婪-例如,当进行模式搜索并替换为一个或两个字符时,默认情况下它只替换找到的第一个匹配(除非全局命令另有规定)。如果它是基于行而不是基于STREAM的,甚至不会有全局命令,因为它一次只能计算行。尝试运行ed;你会注意到差异。如果您想要在特定行上迭代(例如在for循环中),ed非常有用,但大多数时候您只需要sed。尽管如此,sed-e“{:q;N;s/\N//g;t q}”文件在GNUsed版本4.2.1中运行良好。上述命令将用空格替换所有换行符。它很难看,输入起来有点麻烦,但它工作得很好。{}可以省略,因为它们只是出于理智的原因才被包括在内。
其他回答
Perl版本以您预期的方式工作。
perl -i -p -e 's/\n//' file
正如评论中所指出的,值得注意的是,这些编辑是到位的-i.bak将在替换之前为您提供原始文件的备份,以防您的正则表达式没有您想象的那么聪明。
用任何字符串替换换行符,并替换最后一个换行符
纯tr解决方案只能替换为单个字符,纯sed解决方案不能替换输入的最后一行。以下解决方案解决了这些问题,并且似乎对二进制数据是安全的(即使使用UTF-8语言环境):
printf '1\n2\n3\n' |
sed 's/%/%p/g;s/@/%a/g' | tr '\n' @ | sed 's/@/<br>/g;s/%a/@/g;s/%p/%/g'
结果:
1<br>2<br>3<br>
为什么我没有找到一个简单的awk解决方案?
awk '{printf $0}' file
printf将打印没有换行的每一行,如果您想用空格或其他分隔原始行:
awk '{printf $0 " "}' file
cat file | xargs
为了完整起见
这真的很简单。。。当我找到解决办法时,我真的很生气。又少了一个反斜杠。这就是:
sed -i "s/\\\\\n//g" filename