[Linux] 使用 sed 指令,刪除符合正規表示法的第一行

[Linux] 使用 sed 指令,刪除符合正規表示法的第一行

今天想要在 Linux 上用 sed 指令,

將包含某個特定字串的「第一行」刪除~

 

這個任務不太容易,先來看一下原始的輸入資料,

我們想刪除的是包含 aa 這個字串的第一行:

[root@54a3bd19a6f8 /]# cat test.txt
zz1
aa1
bb1
cc1
aa2
bb2
cc2

 

如果直接用 /aa/d 的話,會把所有符合 aa 的行都刪掉,

結果把 aa1 和 aa2 都刪了,而不是只刪了 aa1:

[root@54a3bd19a6f8 /]# cat test.txt | sed '/aa/d'
zz1
bb1
cc1
bb2
cc2

 

sed 支援「指定範圍」的語法,

像下面這個就是要把第 0 行到第一個 aa 之間的行都刪掉,

所以刪掉了開頭的 zz1 和 aa1 行:

[root@54a3bd19a6f8 /]# cat test.txt | sed '0,/aa/d'
bb1
cc1
aa2
bb2
cc2

 

利用這種語法,我們可以使用「兩層」的 sed 來完成工作。

首先用 0,/aa/ 指定範圍是第 0 行到第一個 aa 行,

接著動作的部分使用 {/aa/d} 來刪除範圍內包含 aa 的行,

也就是第一個 aa 行囉:

[root@54a3bd19a6f8 /]# cat test.txt | sed '0,/aa/{/aa/d}'
zz1
bb1
cc1
aa2
bb2
cc2

 

網友建議下面這種寫法也行,

利用 // 來代表前一個出現的正規表示式,也就是 /aa/:

[root@54a3bd19a6f8 /]# cat test.txt | sed '0,/aa/{//d}'
zz1
bb1
cc1
aa2
bb2
cc2

 

雖然語法一開始看很怪,不過真的蠻有用的。

只是要注意的是,上面的用法在 Linux 上可用,

但在 Mac 上執行的結果是完全不同的,

不確定是版本的問題、還是實作方法本來就不同,

使用上得多加注意囉~

 

參考資料:linux – How to remove only the first occurrence of a line in a file using sed – Stack Overflow

(本頁面已被瀏覽過 1,493 次)

2 thoughts on “[Linux] 使用 sed 指令,刪除符合正規表示法的第一行

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料