Bash
使用 n 將文件作為單行回顯
我有一個多行文本文件,我想將其作為單行文件回顯,其中新行顯示為 \n。
任何指針都會很棒。
使用 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}"
請注意您可能需要在這裡考慮的一些特殊情況。讓我們以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
不會受到影響。