正則介紹 sed

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

先來創建一個目錄 sed ,然後把目錄 grep 裏面的文件 passwd 拷貝過來,重命名爲 test.txt ,見下圖,
正則介紹 sed
接着往下操作,sed 的語法很簡單,
正則介紹 sed
以上就是 sed 的用法,'/ /' 裏面是要匹配的字符串,單引號後面加 p ,纔會輸出結果,但是 p 會把所有內容都顯示出來,而目標行會特別的顯示兩行相同的內容出來。不想全部的內容都顯示出來的話,需要在 sed 後面加上 -n ,這樣就可以只顯示目標行了。
sed 同時也支持 . 和 (星),見下圖,
正則介紹 sed
. 和
(星)使用起來和 grep 相同,視覺上看起來麻煩一點。sed 還支持 + 號,見下圖,
正則介紹 sed
不想要脫義的時候,加上 -r 選項就可以。接着演示一些其他選項的用法,見下圖,
正則介紹 sed
上圖用法同 grep 相似,這邊就不贅述。
正則介紹 sed
'2' 表示第二行,'2,5' 表示第二到第五行,$ 表示末行,'25,$' 表示第二十五行到末尾。全部輸出就使用 '1,$' ,見下圖,
正則介紹 sed
以上就是 sed 比 grep 還要豐富的一些功能。
除此之外,sed 還有一些其他用法。
正則介紹 sed
正則介紹 sed
sed 的-e 選項,意思爲在同一個表達式裏面做多個動作,具體操作見下圖,
正則介紹 sed
命令 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 也是區分大小寫的,給 sed 加上 grep 相同的 -i 選項,沒有結果輸出。說明 sed 中不區分大小寫的功能不是 -i 。實際上是大寫的 I ,而且是加到 p 前面的。上圖的結果不明顯,因爲第一行的結果裏面有 bus 也有 Bus,來編輯一下 test.txt 文件,輸入 vi test.txt ,回車,見下圖,
正則介紹 sed
增加上圖紅色框框的內容,保存後退出。接着往下操作,
正則介紹 sed
可以看到,結果有匹配出來,這就是 I 的作用。
除了輸出指定的行,還可以刪除指定的行,具體操作見下圖,
正則介紹 sed
上圖命令刪除了文件 test.txt 的前25行,結果只顯示後面的6行。接着查看文件的行數時,結果還是31行。這說明在使用 sed 刪除行時,沒有真正的刪除行,只是在屏幕上顯示出剩下的行。如果想直接刪除這些行的話,可以使用 -i 選項,具體操作見下圖,在刪除之前,先拷貝一份,
正則介紹 sed
可以看到 -i 選項,直接刪除了 test.txt 文件的內容。除了刪除指定的行,還可以刪除指定字符串所在的行,見下圖,
正則介紹 sed
以上就是刪除的選項 d 的作用,delete 。p 是打印輸出的功能,print。

接着講解替換功能,先將文件 test.txt 拷貝回來,見下圖,
正則介紹 sed
上圖命令會把所有的內容都輸出,然後可以看到前10行的 root 都替換成 toor 了。接着往下操作,
正則介紹 sed
因爲只操作了前十行,可以通過管道符用 head 來查看。結果發現,沒有任何改變。這邊 sed 用到 + 號的話,要加上 -r 選項纔可以,見下圖,
正則介紹 sed
這裏面要替換的字符串可以使用正則表達式,+ 、. 、(星) 、{ } 、[ ] 等等都可以識別。
接着針對前十行,來做一個操作,見下圖,
正則介紹 sed
以上操作的需求,是把以 : 分割的第一列和最後一列的位置替換一下,命令格式比較複雜。sed 命令是支持 | 管道符的,s 爲替換符,不指定範圍的話就是全部。接着對整個命令作解讀: sed -r 's/([^:]+):(.):([^:]+)/\3:\2:\1/' 。第一個部分的“([^:]+):”表示第一個非 : 的字符,+ 表示一個或多個的字符,用 : 分割。中間的“(.):”,不指定特殊符號的話,會一直匹配到最後面的 : 。然後是第三個部分“([^:]+)”,表示非 : 的字符串。這邊需要解釋一下,上例中用 ( ) 把所想要替換的字符括起來成爲一個整體,因爲括號在sed中屬於特殊符號,需要使用 -r 選項來脫義,用 ( ) 小括號括起來也是爲了後面調用。這 ( ) 小括號裏面的三部分,分別用1、2、3表示,寫出來就是\1:\2:\3,這邊我們是要把開頭和尾部互換,所以要寫成 \3:\2:\1 。
以上的思路是,本次操作的目的是要把第一段和最後一段的位置互換一下,所以就要想辦法找到第一段和最後一段,因爲每一行的字符串是以 : 分割的,所以可以通過 : 來作爲參考對象,最後把需求表達出來。前面部分用 ( ) 小括號表示出來,後面部分就用 \ 反斜槓和數字表示。

將 root 替換成 123 ,在 sed 這邊怎麼表達呢?見下圖,
正則介紹 sed
第一個命令寫了兩個 // ,出現報錯,說明是不對的。要解決這個問題,需要在兩個 // 中間使用 \ 脫義符號。接着舉例,見下圖,
正則介紹 sed
上圖第一條命令出現報錯,因爲裏面有好幾個 \ ,系統就不知道怎麼劃分。有兩種解決辦法,一種是加上 \ 脫義符號,另一種是使用 @ 或 # 替換分隔符,只要能區分開就可以。
以上就是 sed 的查找和替換功能。

接着往下操作,將文檔裏的所有英文字母都刪除掉,怎麼表示英文字母呢?見下圖,
正則介紹 sed
字母表示爲 [a-zA-Z] ,刪除掉就是替換爲空。可以看到,命令的結果只剩數字和特殊符號。

在所有行項目的前面加上字符串,具體操作見下圖,
正則介紹 sed
上圖中,命令的需要是在所有行前面加上字符串 aaa:,(.*) 這個小括號括起來表示的是一整行,& 和 \1 的效果是一樣的,表示前面的 ( ) 小括號。

總結:
-e 選項,在同一個表達式裏面做多個動作
-n 選項,可以只顯示目標行
-r 選項,同 \ 的效果一樣,表示脫義,使用了特殊符號時也需要加上 -r
'2' 表示第二行,'2,5' 表示第二到第五行,$ 表示末行,'25,$' 表示第二十五行到末尾。全部輸出就使用 '1,$' ,
I 大寫的i,不區分大小寫,用在 '' 單引號後面
d 刪除用選項,也是用在'' 單引號後面,還有 p 輸出選項
s 替換符號
g 全局替換
& 和 \1 的效果是一樣的,表示前面的 ( ) 小括號
字母表示爲 [a-zA-Z] ,刪除掉就是替換爲空

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章