Bash

使用 n 將文件作為單行回顯

  • July 26, 2017

我有一個多行文本文件,我想將其作為單行文件回顯,其中新行顯示為 \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不會受到影響。

引用自:https://unix.stackexchange.com/questions/381857