1. 程式人生 > >【Shell】sed 同時匹配多個模式

【Shell】sed 同時匹配多個模式

之前在 【Linux】sed 命令最全解析 這篇文章中有提到,使用 sed 實現多個匹配的方法,但是寫的並不全,在此重新補充一下。

sed 命令功能非常強大,通常用於匹配和編輯文字。

預設情況下,一條 sed 命令只能匹配一個模式(模式即匹配規則的意思)。

怎麼用 sed 實現在一條命令中匹配多個模式呢?

有如下幾種方式:

  • 通過 -f 指定指令碼檔案,在檔案中集合多條指令,這裡不再贅述啊;
  • 通過管道符|連線多條 sed 指令;
  • 在一條 sed 指令中使用多個 -e選項實現。
  • 在一條 sed 指令中使用分號 ; 分隔多個匹配模式。

下面使用如下文字內容來做測試:

$ nl 1.txt 
     1  This is my cat,my cat's name is betty
     2  This is my dog,my dog's name is frank
     3  This is my fish, my fish's name is george
     4  This is my goat,my goat's name is adam

1、管道符方式

直接用管道符連線多個普通的 sed 命令即可。

去掉 1.txt 中第三行及後面的內容,並把 name 替換成 mingzi:
$ nl 1.txt | sed '3,$d' | sed 's/name/mingzi/g'
     1  This is my cat,my cat's mingzi is betty
     2  This is my dog,my dog's mingzi is frank

2、使用多個 -e選項實現

在一條 sed 指令中加上多個 -e 選項來指定多個匹配模式。

去掉 1.txt 中第三行及後面的內容,並把 name 替換成 mingzi:
$ nl 1.txt | sed  -e  '3,$d'  -e  's/name/mingzi/g'   
     1  This is my cat,my cat's mingzi is betty
     2  This is my dog,my dog's mingzi is frank

3、使用 ;實現多個匹配

在一條 sed 指令的匹配模式中,通過 ; 分隔多個匹配項。

  • 分號 ; 後面有沒有空格都可以,但是為了美觀最好加上。
去掉 1.txt 中第三行及後面的內容,並把 name 替換成 mingzi:
nl 1.txt | sed '3,$d; s/name/mingzi/g'       
     1  This is my cat,my cat's mingzi is betty
     2  This is my dog,my dog's mingzi is frank

以上三種方式的效果是一樣的,大家可以比較一下。