我有一个文本文件,它的行看起来像这样:
Line1
Line2
Line3
我希望它看起来像这样:
Line1\nLine2\nLine3
所以我尝试了这个命令:
sed ':a;N;$!ba;s/\n/n /g' myfile.txt | tee output.txt
但现在文件上的文本看起来像这样。
Line1n Line2n Line3
我有一个文本文件,它的行看起来像这样:
Line1
Line2
Line3
我希望它看起来像这样:
Line1\nLine2\nLine3
所以我尝试了这个命令:
sed ':a;N;$!ba;s/\n/n /g' myfile.txt | tee output.txt
但现在文件上的文本看起来像这样。
Line1n Line2n Line3
正如评论中指出的那样,您必须\\n
替换\n
. s/\n/n /
只插入一个文字n
后跟一个空格,并且s/\n/\n/
会被许多版本的 sed 解释为换行符,并且什么都不会改变。
而不是循环并将整个文件加载到模式空间中,例如
sed ':a;N;$!ba;s/\n/\\n/g' myfile.txt
您还可以使用-z
查找 NUL 字符来分隔行的选项,这有效地使 sed 将完整文件加载为单行(需要 GNU sed):
sed -z 's/\n/\\n/g' myfile.txt
不过,这确实会附加\n
在文件的最后。这在技术上是正确的,因为每个文件都应该以换行符结尾,但如果你不希望这样,你可以删除它:
sed -z 's/\n/\\n/g;s/\\n$//' myfile.txt
另一种方法(概念上比使用sed
的分支逻辑更简单)是添加到混合中,前提是我们事先知道myfile.txt中没有tr
像 " #
" 这样的字符:
# make a 'myfile.txt' for convenience.
printf 'Line%s\n' 1 2 3 > myfile.txt
tr '\n' '#' < myfile.txt | sed 's/#/\\n/g'
Demo,将其输入反馈给printf
:
printf "$(tr '\n' '#' < myfile.txt | sed 's/#/\\n/g')"
输出:
Line1
Line2
Line3