我可以使用 sed 僅刪除第一個匹配行嗎?

我可以使用 sed 僅刪除第一個匹配行嗎?

我有一個文件testfile.txt包含

pippo=x
pluto=y
1234=z

我只想刪除首先行匹配/^[a-z]\+=/(本例中的第一行)。

我嘗試使用以下命令但沒有成功:

sed   '/^[a-z]\+=/,+0d' testfile.txt

但第一個行被刪除。

有沒有辦法使用 來完成這項任務sed

問候

答案1

sed你的指令有問題

$ sed '/^[a-z]\+=/,+0d' testfile.txt

sed腳本應用於每一個輸入資料的行。

(這+0是一個 GNU 擴充功能)意味著你的腳本相當於

$ sed '/^[a-z]\+=/d' testfile.txt

正如您所注意到的,第一行和第二行將被刪除。

順便說一句,你會得到完全相同的影響使用+1,但出於其他原因。由於第一行匹配,該d命令不會單獨應用於第一行和第二行,而是應用於前兩行(即命令的範圍d將是第一行和第二行,+1)。這不會刪除第三行,因為它超出了範圍。

GNUsed解決方案

$ sed '0,/^[a-z]\+=/{//d}' testfile.txt

用戶 @Whitefield 發布的作品有效且相當不錯(儘管該-r選項是不必要的,並且在這種情況下0起始地址可能會更改為1,如果您想要更加 POSIX 風格)。

相同方法的BSDsed變體看起來像

$ sed '1,/^[a-z]+=/{/^[a-z]+=/d
  }' testfile.txt

+只有當您sed實作「過時的基本正規表示式」而不是「現代基本正規表示式」時,才需要轉義。我的系統(Mac OS X)上的BSDsed和 GNUsed似乎都是「現代」類型。 POSIX 沒有這種區別,並且並排閱讀手冊(re_format(7)在 BSD 上,這造成了這種區別)和 POSIX 規範讓我頭暈目眩。

答案2

@John1024我很抱歉,但只有當第一個匹配行是文件的第一行時,您的解決方案才有效。

我用下面的程式碼解決了這個問題sed -r '0,/^[a-z]\+=/{//d;}' testfile.txt,但我仍然相信我以前的解決方案即使使用 posix sed 也應該可以工作。

事實上,這個想法是給第二行位址一個 0 行的偏移量...但它仍然刪除下面的行,這聽起來像是一個錯誤。

來自man sedubuntu 14.04

... addr1,+N 將符合 addr1 和 addr1 之後的 N 行。 …

相關內容