[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,487 次)
2 thoughts on “[Linux] 使用 sed 指令,刪除符合正規表示法的第一行”
gnu 的 sed 有一些擴增的功能, mac 的sed就是原本的 sed 而已。
非常感謝您的資訊喔~ ^^