Text-Processing
必須有更好的方法來僅替換單個換行符嗎?
我習慣於每句寫一行,因為我通常將內容編譯為 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
僅當模式與目前行匹配時,才會執行以下操作。
並且
^$.
字元在正則表達式中具有特殊含義,其中^
匹配行首、$
行尾和.
任意字元。