Newlines
用 ed 刪除連續的換行符
輸入文件:
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
起來更便攜,更可靠。