我有一个文本文件,其行如下所示:
Line1
Line2
Line3
我希望它看起来像这样:
Line1\nLine2\nLine3
所以我尝试了以下命令:
sed ':a;N;$!ba;s/\n/n /g' myfile.txt | tee output.txt
但是现在文本在文件上看起来像这样。
Line1n Line2n Line3
答案 0 :(得分:1)
如评论中所指出,您必须用\\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
答案 1 :(得分:0)
另一种方式(从概念上讲,比使用sed
的分支逻辑更简单)是将tr
添加到混合中,前提是我们事先知道有一些像“ #
”这样的字符在 myfile.txt 中的 not :
# make a 'myfile.txt' for convenience.
printf 'Line%s\n' 1 2 3 > myfile.txt
tr '\n' '#' < myfile.txt | sed 's/#/\\n/g'
演示,它将其输入反馈回printf
:
printf "$(tr '\n' '#' < myfile.txt | sed 's/#/\\n/g')"
输出:
Line1
Line2
Line3