Sed

‘sed -e’ 和用分號分隔多個命令之間的區別

  • February 19, 2021

我可能在這裡挑剔,但如果能一勞永逸地回答這個一直困擾我的問題,那就太好了……

reprex 的文本文件:

Line one.
Line two.

Line three.
Line four.

要在此文本文件中始終添加一個額外的空行sed,每行需要兩個命令。這可以使用以下任何語法來實現:

  1. sed -e '/^$/d' -e '$!G' <file>…但不是(sed -e '/^$/d' '$!G' <file>sed '/^$/d' '$!G' <file>
  2. sed -e '/^$/d; $!G' <file>或者sed -e '/^$/d ; $!G' <file>
  3. sed '/^$/d; $!G' <file>或者sed '/^$/d ; $!G' <file>

我的問題是:

  1. 上面列出的五種工作語法中的任何一種之間是否有任何真正的區別(普遍性?、合規性?…)?
  2. Richard Blum 的最新命令行和 Shell 腳本聖經sed -e 's/brown/red/; s/dog/cat/' data1.txt說在給出以下建議之前使用類似的東西……

命令必須用分號 (;) 分隔,並且在第一個命令的結尾和分號之間不應有任何空格。

…然後通過完全不使用該-e選項並在命令末尾和分號之間添加空格(如上面#3的第二個變體所示)繼續完全忽略他自己的建議。所以,分號周圍的間距有什麼真正的區別嗎?

  1. 儘管我在手冊頁或文件中找不到這方面的資訊,但我的預感是該-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;都存在,但它們不是多餘的。

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