1. 程式人生 > >正則介紹 sed

正則介紹 sed

正則介紹 sed

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

先來創建一個目錄 sed ,然後把目錄 grep 裏面的文件 passwd 拷貝過來,重命名為 test.txt ,見下圖,
技術分享圖片
接著往下操作,sed 的語法很簡單,
技術分享圖片
以上就是 sed 的用法,‘/ /‘ 裏面是要匹配的字符串,單引號後面加 p ,才會輸出結果,但是 p 會把所有內容都顯示出來,目標行會特別的顯示兩行相同的內容出來。不想全部的內容都顯示出來的話,需要在 sed 後面加上 -n ,就可以只顯示目標行了。

sed 同時也支持 . 和 ,見下圖,
技術分享圖片
. 和
視覺上,看起來麻煩一點。sed 還支持 + 號,見下圖,
技術分享圖片
不想要脫義的時候,加上 -r 選項就可以。接著演示一些其他選項的用法,見下圖,
技術分享圖片
上圖用法同 grep 相似,這邊就不贅述。
技術分享圖片
‘2‘ 表示第二行,‘2,5‘ 表示第二到第五行,$ 表示末行,‘25,$‘ 表示第二十五行到末尾。全部輸出就使用 ‘1,$‘ ,見下圖,
技術分享圖片
以上就是 sed 比 grep 還要豐富的一些功能。
除此之外,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