在開始寫以前,先申明,本文是本身看書後,用本身的語言總結下來的筆記,若有不對之處,還請各位博友予以指正。linux
shell腳本最經常使用的功能之一就是處理文本文件,咱們利用編寫的shell腳本能夠簡化重啓服務器的操做步驟,重啓各類服務,進行各類應用服務的自動化部署,簡化了很多操做時間。然而shell腳本也有不足之處,就是在處理文本內容上不是那麼靈活了。shell
假若有多個文件,內容大致相似,可是須要將裏面的個別字符替換爲咱們須要的字符,在這個時候,shell腳本就顯得力不從心了。不過sed編輯器的出現,彌補了shell腳本的不足。sed命令行編輯器可以很方便的格式化、插入、修改、替換文本內容。linux下最經常使用的兩個文本命令行編輯器就是sed和gawk,本文記錄的是sed命令行編輯器的使用。bash
使用sed命令格式爲 sed options script file options參數容許自定義sed運行行爲服務器
參數以下: 編輯器
-e script | 將腳本中指定的命令添加處處理輸入時執行的命令中 |
-f file | 將文件中指定的命令添加處處理輸入時執行的命令中 |
-n | 不須要爲每一個命令產生輸出,但要等待打印命令 |
下面用個簡單的例子作一下文本字符替換練習:ide
$ echo "this is study script" | sed 's/script/bashshell/'this
this is study bashshellspa
利用管道,將數據流傳送給sed進行替換,本例中sed使用了s命令,用第二個字符串bashshell替換了script。固然,這個例子只是編輯了一行數據,若是多行數據,處理的速度是否可以使用相同時間呢?接着看下面這個例子命令行
$ cat test.txtip
this is test script
this is test script
this is test script
this is test script
this is test script
$ sed 's/script/shell/' test.txt
this is test shell
this is test shell
this is test shell
this is test shell
this is test shell
sed命令執行與返回數據幾乎同時進行,它在處理每一行數據的同時,會顯示執行後的結果,在sed編輯器結束處理整個文件以前,就能看到結果。
注意,sed編輯器並不修改文件中的內容,利用cat test.txt查看文件,結果文件中的內容仍是原來的。咱們再加上- i參數執行後試試看。
$ sed -i 's/script/shell/' test.txt
執行完畢後,並不顯示執行後的結果,可是文件中的script卻已經被替換成shell字符了。這就是- i選項的用意。
若是一次性要處理多個命令,sed支持在命令行中使用多個編輯器命令,可是要加上-e參數,使用;將多個命令隔開。
$ sed -e 's/test/dog/;s/script/shell/' test.txt
兩個命令之間,必需要用分號隔開,且在命令結尾和分號之間,不能有任何空格。
除了分號分隔命令外,在bash shell當中,咱們還可使用次提示符 ,只須要輸入前單引號打開腳本,bash會提示你繼續輸入,直到你鍵入後單引號結束。
咱們再創建一個新的內容較多的文本。
$ cat test2.txt
this is script test, we are study bash shell
this is script test, we are study bash shell
this is script test, we are study bash shell
this is script test, we are study bash shell
this is script test, we are study bash shell
$ sed -e'
> s/script/shell/
> s/study/learning/
> s/bash/c/' test2.txt
this is shell test, we are learning c shell
this is shell test, we are learning c shell
this is shell test, we are learning c shell
this is shell test, we are learning c shell
this is shell test, we are learning c shell
小提示: 必定要在後單引號出現的同一行上完成該命令,由於bash檢測到後單引號就處理命令。
若是有多個sed命令要處理,那麼咱們能夠把這些命令單獨保存在一個文件當中,而後加上-f選項指定文件進行處理,會更加方便。咱們將上述例子中執行的多個命令寫入script1文件當中,而後加上-f選項進行處理。
$ cat script1
s/script/shell/
s/study/learning/
s/bash/c/
$ sed -f script1 test2.txt
this is shell test, we are learning c shell
this is shell test, we are learning c shell
this is shell test, we are learning c shell
this is shell test, we are learning c shell
this is shell test, we are learning c shell
你們已看到上述例子當中,使用s命令將新文本替換某一行的文本,不過,還有其餘幾個選項可用於文本替換。
對於替換命令替換文本字符串匹配模式的方法,有一個值得注意的地方,下面就先看看這個例子:
$ cat test2.txt
this is script test, we are test bash shell
this is script test, we are test bash shell
this is script test, we are test bash shell
this is script test, we are test bash shell
this is script test, we are test bash shell
$ sed 's/test/study/' test2.txt
this is script study, we are test bash shell
this is script study, we are test bash shell
this is script study, we are test bash shell
this is script study, we are test bash shell
this is script study, we are test bash shell
看到了嗎?用s命令將test替換爲study的時候,只是替換了文本內每行的第一個匹配字符,第二個匹配字符並無被替換掉。
要使替換命令繼續替換接下來匹配的字符,則必須使用替換標記,替換標記要放在替換命令字符串以後,格式以下:
s/pattern/replacement/flags
就先記錄到這裏吧,下一篇再接着講替換標記。