将文件作为带有 \n 的单行回显

Lou*_*hon 4 bash echo cat

我有一个多行文本文件,我想将它作为单行文件回显,其中新行显示为 \n。

任何指针都会很棒。

ilk*_*chu 7

使用 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)


Sté*_*las 5

请注意您可能需要在此处考虑的一些特殊情况。让我们以4个文件为例:

如果你想:

  • file1:
  • file2\n?
  • file3foo\nbar\n?
  • file4foo\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)

忽略最后一行的定界符的解决方案为file1file2(以及非正确定界的文本 ( file4) 可能无法与所有sed/paste实现正常工作,因为它们旨在处理有效文本)产生一个空行。

perl -pe 's/\n?$/eof ? "\n" : "\\n"/e' < file
Run Code Online (Sandbox Code Playgroud)

可能是更轻便,也许对于稍微好一点file1file2它会离开不变。


Lou*_*hon 2

我使用的解决方案是。

< file.txt sed '$!G' | paste -sd '\\n' -
Run Code Online (Sandbox Code Playgroud)
  • sed '$!G'向除最后 ( $) 行之外的每一行输入添加一个空行。
  • paste -sd '\\n'使用反斜杠和 交替粘贴这些结果行n。并在末尾添加换行符以产生有效的文本输出。