我有一個文件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 sed
ubuntu 14.04
... addr1,+N 將符合 addr1 和 addr1 之後的 N 行。 …