Sed
‘sed -e’ 和用分號分隔多個命令之間的區別
我可能在這裡挑剔,但如果能一勞永逸地回答這個一直困擾我的問題,那就太好了……
reprex 的文本文件:
Line one. Line two. Line three. Line four.
要在此文本文件中始終添加一個額外的空行
sed
,每行需要兩個命令。這可以使用以下任何語法來實現:
sed -e '/^$/d' -e '$!G' <file>
…但不是(sed -e '/^$/d' '$!G' <file>
或sed '/^$/d' '$!G' <file>
)sed -e '/^$/d; $!G' <file>
或者sed -e '/^$/d ; $!G' <file>
sed '/^$/d; $!G' <file>
或者sed '/^$/d ; $!G' <file>
我的問題是:
- 上面列出的五種工作語法中的任何一種之間是否有任何真正的區別(普遍性?、合規性?…)?
- Richard Blum 的最新命令行和 Shell 腳本聖經
sed -e 's/brown/red/; s/dog/cat/' data1.txt
說在給出以下建議之前使用類似的東西……命令必須用分號 (;) 分隔,並且在第一個命令的結尾和分號之間不應有任何空格。
…然後通過完全不使用該
-e
選項並在命令末尾和分號之間添加空格(如上面#3的第二個變體所示)繼續完全忽略他自己的建議。所以,分號周圍的間距有什麼真正的區別嗎?
- 儘管我在手冊頁或文件中找不到這方面的資訊,但我的預感是該
-e
選項的使用如上面的語法編號 #1 所示,並且在命令行上同時使用 和 是多餘的-e
。;
我對麼?編輯:我應該在我原來的問題中提到這一點,以使其更具體;但正如一些人已經指出的那樣,這些細微差別在使用分支(
b
)或測試(t
)命令時會很重要。但有趣的是注意到其他情況會產生影響。謝謝!
讓我們使用Sed POSIX 標準來回答這些問題。
分號周圍的間距有什麼真正的區別嗎?
{…}、a、b、c、i、r、t、w、: 和 # 以外的編輯命令可以後跟分號、可選的空白字元和另一個編輯命令。
因此
/^$/d ; $!G
不符合要求,但符合要求/^$/d; $!G
。但我確實想知道是否有任何現代的 Sed 實現會偶然發現它。上面列出的三種語法之間是否有任何真正的區別(通用性、合規性……)?
否(如上所述,分號前有空格的除外)。這在大綱中很清楚:
sed [-n] script [file...] sed [-n] -e script [-e script]... [-f script_file]... [file...]
但是請注意,正如前面的引用所提到的,某些命令後面不能跟分號,然後
sed -e ':a' -e 's/x/y/' -e 't a'
是合規的,而
sed ':a;s/x/y;t a'
不是,但至少在 GNU Sed 中是一樣的。
我的預感是 (…)在命令行上同時使用
-e
和是多餘的。;
我對麼?如果您參考問題中的範例,是的。如果只有一個
-e
選項,那麼只需將其刪除,它都是一樣的(除非您也使用該-f
選項(請參閱概要))。但在sed -e ':a' -e 's/x/y;t a'
兩者
-e
和;
都存在,但它們不是多餘的。