我有一个多行文本文件,我想将其作为单行文件回显,其中新行显示为 \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
file3
:foo\nbar\n
file4
:foo\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
。并在末尾添加换行符以产生有效的文本输出。