Text-Processing

sed有條件移除EOL

  • August 2, 2018

對於以下範例,我們在末尾有“\”,應該刪除 \ 和 EOL 字元。

line 1\
line 2
line 3
line 4\
line 5

輸出應該是

line 1 line 2
line 3
line 4 line 5

使用 vi,我可以獲得以下內容::%s/\//n//g

但是當我在終端上執行它時不起作用。有什麼建議麼?

嗯… Vi 替換在我嘗試過的任何 Vi 編輯器中:%s/\\\n/ /g都不起作用。您可能是指在 Vim 中可以使用,但在 Vi 中不行。


$ sed '/\\$/{N;s/\\\n/ /;}' file
line 1 line 2
line 3
line 4 line 5

這會檢測目前行是否以反斜杠結尾,如果是,則附加下一行(sed將在它們之間添加換行符),用空格字元替換反斜杠和換行符。

如果兩個連續的行末尾有反斜杠,這將失敗。為此,使用類似的東西

sed ':top;/\\$/{N;s/\\\n/ /;btop;}' file

在這裡,如果已經處理了帶有反斜杠的行,則程式碼跳回到開頭。

sed最後一個腳本的註釋版本:

:top;             # define label "top"
/\\$/{            # the line ends with backslash
   N;            # append next line to pattern space with embedded newline
   s/\\\n/ /;    # substitute backslash and newline with space
   btop;         # branch to "top"
}
                 # (implicit print)

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