2

我有一个文本文件,它的行看起来像这样:

Line1
Line2
Line3

我希望它看起来像这样:

Line1\nLine2\nLine3

所以我尝试了这个命令:

sed ':a;N;$!ba;s/\n/n /g' myfile.txt | tee output.txt

但现在文件上的文本看起来像这样。

Line1n Line2n Line3
4

2 回答 2

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
于 2018-11-16T18:34:56.190 回答
0

另一种方法(概念上比使用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
于 2018-11-17T04:59:59.453 回答