Text-Processing

必須有更好的方法來僅替換單個換行符嗎?

  • August 11, 2020

我習慣於每句寫一行,因為我通常將內容編譯為 LaTeX,或者以其他格式編寫,其中換行符被忽略。我用一個空行來表示一個新段落的開始。

現在,我有一個以這種風格編寫的文件,我想將其作為純文字發送。我想刪除所有單換行符,但保持雙換行符完好無損。這就是我所做的:

sed 's/^$/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt

這會用一些我確信不會出現在文件中的文本替換空行:NEWLINE然後它會刪除所有換行符awk(我在某些網站上發現了這個技巧),然後它用NEWLINE必要的兩個換行符替換了 s 。

這似乎是做一件非常簡單的事情的冗長方法。有沒有更簡單的方法?此外,如果有一種方法可以用單個空格替換多個空格(有時會由於某種原因潛入),那也很好。

我使用 emacs,所以如果有一些特定於 emacs 的技巧很好,但我寧願看到純版本sed或純awk版本。

您可以像這樣使用 awk:

$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } ' test

或者,如果您最後需要一個額外的換行符:

$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } END { print ""; } ' test

或者,如果您想用換行符分隔段落:

$ awk ' /^$/ { print "\n"; } /./ { printf("%s ", $0); } END { print ""; } ' test

這些 awk 命令使用由模式保護的操作:

/regex/

要麼

END

僅當模式與目前行匹配時,才會執行以下操作。

並且^$.字元在正則表達式中具有特殊含義,其中^匹配行首、$行尾和.任意字元。

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