正則介紹 sed

grep工具的功能其實還不夠強大,grep實現的只是查找功能,而它卻不能實現把查找的內容替換掉。之前用vim的時候,能夠查找也能夠替換,可是隻侷限於在文本內部來操做,而不能輸出到屏幕上。sed工具以及後面要講的awk工具就能實現把替換的文本輸出到屏幕上的功能了,並且還有其餘更豐富的功能。sed和awk都是流式編輯器,是針對文檔的行來操做的。正則表達式

 

先來建立一個目錄 sed ,而後把目錄 grep 裏面的文件 passwd 拷貝過來,重命名爲 test.txt ,見下圖,vim

接着往下操做,sed 的語法很簡單,編輯器

以上就是 sed 的用法,'/ /' 裏面是要匹配的字符串,單引號後面加 p ,纔會輸出結果,可是 p 會把全部內容都顯示出來,而目標行會特別的顯示兩行相同的內容出來。不想所有的內容都顯示出來的話,須要在 sed 後面加上 -n ,這樣就能夠只顯示目標行了。工具

sed 同時也支持 . 和 * ,見下圖,3d

. 和 * 使用起來和 grep 相同,視覺上看起來麻煩一點。sed 還支持 + 號,見下圖,對象

不想要脫義的時候,加上 -r 選項就能夠。接着演示一些其餘選項的用法,見下圖,blog

上圖用法同 grep 類似,這邊就不贅述。文檔

'2' 表示第二行,'2,5' 表示第二到第五行,$ 表示末行,'25,$' 表示第二十五行到末尾。所有輸出就使用 '1,$' ,見下圖,字符串

以上就是 sed 比 grep 還要豐富的一些功能。test

除此以外,sed 還有一些其餘用法。

sed 的-e 選項,意思爲在同一個表達式裏面作多個動做,具體操做見下圖,

命令 sed -e '1'p -e '/bus/'p -n test.txt ,回車以後,會先輸出 '1'p 的結果,再輸出 '/bus/'p 的結果。接着再經過命令 sed -e '1'p -e '/root/'p -n test.txt ,來驗證結果。能夠看到 root 這一行的結果輸出了兩遍,說明 -e 輸出的是兩個不一樣的表達式結果。三個 -e 的結果也是同樣的,是互相不衝突的。

grep 裏的 -i 選項能夠實現不區分大小寫的功能,那麼 sed 裏面有嗎?見下圖,

上圖中能夠看到,sed 也是區分大小寫的,給 sed 加上 grep 相同的 -i 選項,沒有結果輸出。說明 sed 中不區分大小寫的功能不是 -i 。其實是大寫的 I ,並且是加到 p 前面的。上圖的結果不明顯,由於第一行的結果裏面有 bus 也有 Bus,來編輯一下 test.txt 文件,輸入 vi test.txt ,回車,見下圖,

增長上圖紅色框框的內容,保存後退出。接着往下操做,

能夠看到,結果有匹配出來,這就是 I 的做用。

除了輸出指定的行,還能夠刪除指定的行,具體操做見下圖,

上圖命令刪除了文件 test.txt 的前25行,結果只顯示後面的6行。接着查看文件的行數時,結果仍是31行。這說明在使用 sed 刪除行時,沒有真正的刪除行,只是在屏幕上顯示出剩下的行。若是想直接刪除這些行的話,可使用 -i 選項,具體操做見下圖,在刪除以前,先拷貝一份,

能夠看到 -i 選項,直接刪除了 test.txt 文件的內容。除了刪除指定的行,還能夠刪除指定字符串所在的行,見下圖,

以上就是刪除的選項 d 的做用,delete 。p 是打印輸出的功能,print。

 

接着講解替換功能,先將文件 test.txt 拷貝回來,見下圖,

上圖命令會把全部的內容都輸出,而後能夠看到前10行的 root 都替換成 toor 了。接着往下操做,

由於只操做了前十行,能夠經過管道符用 head 來查看。結果發現,沒有任何改變。這邊 sed 用到 + 號的話,要加上 -r 選項才能夠,見下圖,

這裏面要替換的字符串可使用正則表達式,+ 、. 、* 、{ } 、[ ] 等等均可以識別。

接着針對前十行,來作一個操做,見下圖,

以上操做的需求,是把以 : 分割的第一列和最後一列的位置替換一下,命令格式比較複雜。sed 命令是支持 | 管道符的,s 爲替換符,不指定範圍的話就是所有。接着對整個命令做解讀: sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' 。第一個部分的「([^:]+):」表示第一個非 : 的字符,+ 表示一個或多個的字符,用 : 分割。中間的「(.*):」,不指定特殊符號的話,會一直匹配到最後面的 : 。而後是第三個部分「([^:]+)」,表示非 : 的字符串。這邊須要解釋一下,上例中用 ( ) 把所想要替換的字符括起來成爲一個總體,由於括號在sed中屬於特殊符號,須要使用 -r 選項來脫義,用 ( ) 小括號括起來也是爲了後面調用。這 ( ) 小括號裏面的三部分,分別用一、二、3表示,寫出來就是\1:\2:\3,這邊咱們是要把開頭和尾部互換,因此要寫成 \3:\2:\1 。

以上的思路是,本次操做的目的是要把第一段和最後一段的位置互換一下,因此就要想辦法找到第一段和最後一段,由於每一行的字符串是以 : 分割的,因此能夠經過 : 來做爲參考對象,最後把需求表達出來。前面部分用 ( ) 小括號表示出來,後面部分就用 \ 反斜槓和數字表示。

 

將 root 替換成 123 ,在 sed 這邊怎麼表達呢?見下圖,

第一個命令寫了兩個 // ,出現報錯,說明是不對的。要解決這個問題,須要在兩個 // 中間使用 \ 脫義符號。接着舉例,見下圖,

上圖第一條命令出現報錯,由於裏面有好幾個 \ ,系統就不知道怎麼劃分。有兩種解決辦法,一種是加上 \ 脫義符號,另外一種是使用 @ 或 # 替換分隔符,只要能區分開就能夠。

以上就是 sed 的查找和替換功能。

 

接着往下操做,將文檔裏的全部英文字母都刪除掉,怎麼表示英文字母呢?見下圖,

字母表示爲 [a-zA-Z] ,刪除掉就是替換爲空。能夠看到,命令的結果只剩數字和特殊符號。

 

在全部行項目的前面加上字符串,具體操做見下圖,

上圖中,命令的須要是在全部行前面加上字符串 aaa:,(.*) 這個小括號括起來表示的是一整行,& 和 \1 的效果是同樣的,表示前面的 ( ) 小括號。

 

總結:

-e 選項,在同一個表達式裏面作多個動做

-n 選項,能夠只顯示目標行

-r 選項,同 \ 的效果同樣,表示脫義,使用了特殊符號時也須要加上 -r

'2' 表示第二行,'2,5' 表示第二到第五行,$ 表示末行,'25,$' 表示第二十五行到末尾。所有輸出就使用 '1,$' ,

I 大寫的i,不區分大小寫,用在 '' 單引號後面

d 刪除用選項,也是用在'' 單引號後面,還有 p 輸出選項

s 替換符號

g 全局替換

& 和 \1 的效果是同樣的,表示前面的 ( ) 小括號

字母表示爲 [a-zA-Z] ,刪除掉就是替換爲

相關文章
相關標籤/搜索