使用 Perl 大锤:
$ perl -pe 's/\n/\\n/' < file.txt ; echo
Run Code Online (Sandbox Code Playgroud)
在echo有打印结尾的新行,以防万一它希望进行显示。这会将最后一行的 NL 也更改为\n。
或者一个相当简单的 Bash 解决方案,假设文件不包含任何嵌入的 NUL 字节。但请注意,这会将整个文件加载到内存中:
$ IFS= read -r -d '' text < file.txt; printf '%s\n' "${text//$'\n'/\\n}"
Run Code Online (Sandbox Code Playgroud)
请注意您可能需要在此处考虑的一些特殊情况。让我们以4个文件为例:
file1 一个空文件file2 具有单个换行符 (?) 字符的文件(一个空行)file3 一个适当的文本文件,如:
foo?
bar?
Run Code Online (Sandbox Code Playgroud)file4 最后一行未分隔的文件:
foo?
bar
Run Code Online (Sandbox Code Playgroud)如果你想:
file1:空file2: \n?file3: foo\nbar\n?file4: foo\nbar?(例如,您可以通过将输出传递给 来重建文件printf %b)。
然后,你可以这样做:
perl -pe 's/\n/\\n/; END{print "\n" if $.}' < file
Run Code Online (Sandbox Code Playgroud)
或者使用 GNU awk:
gawk '{printf "%s", $0 (RT ? "\\n" : "")}
END{if (NR) print ""}' < file
Run Code Online (Sandbox Code Playgroud)
如果您想忽略最后一行的定界符(如果有的话),或者不想要尾随换行符,您可以进行调整,但是您可能想测试这 4 种不同的情况,它可以满足您的需求,因为您可能会发现您需要对其中一些进行特殊处理。
例如,您的
< file sed '$!G' | paste -sd '\\n' -
Run Code Online (Sandbox Code Playgroud)
忽略最后一行的定界符的解决方案为file1和file2(以及非正确定界的文本 ( file4) 可能无法与所有sed/paste实现正常工作,因为它们旨在处理有效文本)产生一个空行。
perl -pe 's/\n?$/eof ? "\n" : "\\n"/e' < file
Run Code Online (Sandbox Code Playgroud)
可能是更轻便,也许对于稍微好一点file1和file2它会离开不变。
我使用的解决方案是。
< file.txt sed '$!G' | paste -sd '\\n' -
Run Code Online (Sandbox Code Playgroud)
sed '$!G'向除最后 ( $) 行之外的每一行输入添加一个空行。paste -sd '\\n'使用反斜杠和 交替粘贴这些结果行n。并在末尾添加换行符以产生有效的文本输出。