Newlines

用 ed 刪除連續的換行符

  • December 10, 2012

輸入文件:

1 line1\
2 line2\
3 line3\
4 \
5 line4\
6 \
7 \
8 line5\

期望的輸出:

1 line1
2 line2
3 line3
4
5 line4
6
7 line5

POSIX可以ed嗎?

刪除尾隨反斜杠很容易,但我怎樣才能將連續的黑斜杠作為預期輸出處理?

不知道如何一口氣做到這一點。但是如果內容是眾所周知的,可以在雙行中添加一個唯一的字元串。

# Add XX to lines that should be deleted
g/^$/+1s/^$/XX/
# Delete them
g/XX/d

不是很好。

使用sed,您可以執行以下操作:

sed 's/\\$//;/./,/^$/!d'

(除了來自另一個時代的語法之外)的主要問題之一ed是腳本中的錯誤處理。

ed基本上,如果成功編輯文件,您必須將其視為返回成功。但要成功編輯,您必須讓每個命令地址有效,每個命令都成功(例如,對於s命令,這意味著至少完成一次替換)。

因此,如果您想在這種情況下檢查編輯是否成功,可能會很棘手。

為了建立@Sukminder 的解決方案並嘗試涵蓋極端情況,可以編寫:

printf '%s\n' a a . 'g/\\$/s///' ',s/^/a/' 'g/^a$/+1,/./s/^a$//' \
 'v/./d' 'g/^a/s///' '$d' w | ed -s the-file

如果文件為空,該g命令將失敗(因為預設地址範圍 ( 1,$) 將無效,因此我們需要首先在文件末尾添加一行(使用a命令)。,s/\\$//如果沒有以結尾的行將失敗\所以我們只有在有這樣的行時才需要執行它(g/\\$/s///)。

在這裡,我們假設在輸入中找不到“xx”,而不是插入“xx”,而是在每一行前面加上“a”,並將要刪除的行替換為我們之後刪除的空行。

希望該腳本僅在無法寫入文件(命令失敗)ed時才返回非零退出狀態。不幸的是,當 FS 已滿時無法寫入文件時w,我已經看到實現返回成功。ed

IMO,ed最好避免。如今,使用perl -pi.back起來更便攜,更可靠。

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