使用 \n 将文件回显为单行

使用 \n 将文件回显为单行

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

任何指点都会很棒。

答案1

使用 Perl 大锤:

$ perl -pe 's/\n/\\n/' < file.txt ; echo

可以echo打印尾随换行符,以防需要用于显示目的。这也将最后一行的 NL 更改为\n

或者在 Bash 中使用一个相当简单的解决方案,假设文件不包含任何嵌入的 NUL 字节。但请注意,这会将整个文件加载到内存中:

$ IFS= read -r -d '' text < file.txt; printf '%s\n' "${text//$'\n'/\\n}"

答案2

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

  • file1一个空文件
  • file2具有单个换行符 (␤) 字符(一个空行)的文件
  • file3一个正确的文本文件,例如:

    foo␤
    bar␤
    
  • file4最后一行未分隔的文件:

    foo␤
    bar
    

如果你想:

  • file1空的
  • file2\n␤
  • file3foo\nbar\n␤
  • file4foo\nbar␤

(例如,您可以通过将输出传递给 来重建文件printf %b)。

然后,你可以这样做:

perl -pe 's/\n/\\n/; END{print "\n" if $.}' < file

或者使用 GNU awk

gawk '{printf "%s", $0 (RT ? "\\n" : "")}
      END{if (NR) print ""}' < file

如果您想忽略最后一行的分隔符(如果有),或者不想要尾随换行符,您可以进行调整,但是您可能想测试这 4 种不同的情况,它是否能满足您的要求,您可能会发现您需要对其中一些进行特殊治疗。

例如,你的

< file sed '$!G' | paste -sd '\\n' -

忽略最后一行分隔符的解决方案会为file1和生成一个空行file2(对于未正确分隔的文本 ( file4) 可能无法与所有sed/paste实现正常工作,因为这些实现旨在处理有效文本)。

perl -pe 's/\n?$/eof ? "\n" : "\\n"/e' < file

可能更便携,也许稍微好一点,file1并且file2它不会受到影响。

答案3

tr单独无法做到这一点,因为您需要用两个字符替换一个字符。sed单独使用它并不能轻松做到这一点,因为它在打印的所有内容的末尾都会输出换行符。但是您可以通过将两者结合起来来做到这一点:\n在每行末尾添加,然后删除换行符。

sed 's/$/\\n/' | tr -d '\n'

\n这会生成一个以无换行符结尾的文件。如果你想在最后换行,请回显它:

{ sed 's/$/\\n/' | tr -d '\n'; echo; }

(请注意,这会将一个空文件变成一个只有一个空行的文件。)如果您不需要最后一个\n,请将其删除:

sed 's/$/\\n/' | tr -d '\n' | sed 's/\\n$//'

答案4

我使用的解决方案是。

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

相关内容