shell 腳本入門--sed命令匹配

轉載:
http://man.linuxde.net/sed

簡介

sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。

sed 命令格式

[root@www ~]# sed [-nefr] [動作]
選項與參數:
-n :使用安靜(silent)模式。在一般 sed 的用法中,所有來自 STDIN 的數據一般都會被列出到終端上。但如果加上 -n 參數後,則只有經過sed 特殊處理的那一行(或者動作)纔會被列出來。
-e :直接在命令列模式上進行 sed 的動作編輯;
-f :直接將 sed 的動作寫在一個文件內, -f filename 則可以運行 filename 內的 sed 動作;
-r :sed 的動作支持的是延伸型正規表示法的語法。(默認是基礎正規表示法語法)
-i :直接修改讀取的文件內容,而不是輸出到終端。
動作說明: [n1[,n2]]function

n1, n2 :不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行爲] 』

function:
a :新增, a 的後面可以接字串,而這些字串會在新的一行出現(目前的下一行)~
c :取代, c 的後面可以接字串,這些字串可以取代 n1,n2 之間的行!
d :刪除,因爲是刪除啊,所以 d 後面通常不接任何咚咚;
i :插入, i 的後面可以接字串,而這些字串會在新的一行出現(目前的上一行);
p :列印,亦即將某個選擇的數據印出。通常 p 會與參數 sed -n 一起運行~
s :取代,可以直接進行取代的工作哩!通常這個 s 的動作可以搭配正規表示法!例如 1,20s/old/new/g 就是啦!

補充:
a\ 在當前行下面插入文本。
i\ 在當前行上面插入文本。
c\ 把選定的行改爲新的文本。
d 刪除,刪除選擇的行。
D 刪除模板塊的第一行。
s 替換指定字符
h 拷貝模板塊的內容到內存中的緩衝區。
H 追加模板塊的內容到內存中的緩衝區。
g 獲得內存緩衝區的內容,並替代當前模板塊中的文本。
G 獲得內存緩衝區的內容,並追加到當前模板塊文本的後面。
l 列表不能打印字符的清單。
n 讀取下一個輸入行,用下一個命令處理新的行而不是用第一個命令。
N 追加下一個輸入行到模板塊後面並在二者間嵌入一個新行,改變當前行號碼。
p 打印模板塊的行。
P(大寫) 打印模板塊的第一行。
q 退出Sed。
b lable 分支到腳本中帶有標記的地方,如果分支不存在則分支到腳本的末尾。
r file 從file中讀行。
t label if分支,從最後一行開始,條件一旦滿足或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
T label 錯誤分支,從最後一行開始,一旦發生錯誤或者T,t命令,將導致分支到帶有標號的命令處,或者到腳本的末尾。
w file 寫並追加模板塊到file末尾。
W file 寫並追加模板塊的第一行到file末尾。
! 表示後面的命令對所有沒有被選定的行發生作用。
= 打印當前行號碼。

相關元字符集
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
/sed /匹配所有以sed結尾的行。
* 匹配0個或多個字符,如:/*sed/匹配所有模板是一個或多個空格後緊跟sed的行。
[] 匹配一個指定範圍內的字符,如/[ss]ed/匹配sed和Sed。
\ (..\) 匹配子串,保存匹配的字符,如s/(love)able/\1rs,loveable被替換成lovers。
\< 匹配單詞的開始,如:/\ 匹配單詞的結束,如/love>/匹配包含以love結尾的單詞的行。
x{m,} 重複字符x,至少m次,如:/0{5,}/匹配至少有5個0的行。
x{m,n} 重複字符x,至少m次,不多於n次,如:/0{5,10}/匹配5~10個0的行。

相關用例

  1. s 替換命令(原文件不會修改,sed 執行命令後,打印屏幕內容爲 this is a books,但實際內容爲 this is a test,加入-i ,會直接修改文件內容)
guosheng@guosheng:~/code/practice/bash_practice$ vi test1.sh 
guosheng@guosheng:~/code/practice/bash_practice$ sed 's/test/books/' test1.sh 
#!/bin/sh
# This is a books
guosheng@guosheng:~/code/practice/bash_practice$ cat test1.sh 
#!/bin/sh
# This is a test
guosheng@guosheng:~/code/practice/bash_practice$ 
guosheng@guosheng:~/code/practice/bash_practice$ sed -i '$a /test/books/' test1.sh 
guosheng@guosheng:~/code/practice/bash_practice$ cat test1.sh 
#!/bin/sh
# This is a test
/test/books/
guosheng@guosheng:~/code/practice/bash_practice$ sed -i 's/test/books/' test1.sh 
guosheng@guosheng:~/code/practice/bash_practice$ cat test1.sh 
#!/bin/sh
# This is a books
/books/books/

2.全面替換g

sed 's/book/books/g' file
echo sksksksksksk | sed 's/sk/SK/2g' 
skSKSKSKSKSK 
echo sksksksksksk | sed 's/sk/SK/3g' 
skskSKSKSKSK 
echo sksksksksksk | sed 's/sk/SK/4g' 
skskskSKSKSK

3./ 作爲定界符號

4.d 刪除命令

刪除空白行: sed '/^$/d' file 
刪除文件的第2行: sed '2d' file
刪除文件的第2行到末尾所有行:sed '2,$d' file
刪除文件最後一行:sed '$d' file
刪除文件中所有開頭是test的行: sed '/^test/'d file

5.已匹配字符串標記&

正則表達式 \w\+ 匹配每一個單詞,使用 [&] 替換它,& 對應於之前所匹配到的單詞:
echo this is a test line | sed 's/\w\+/[&]/g'
 [this] [is] [a] [test] [line] 
 所有以192.168.0.1開頭的行都會被替換成它自已加localhost:
 sed 's/^192.168.0.1/&localhost/'
 file 192.168.0.1localhost

6.子串匹配標記\1

 echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
 this is 7 in a number
命令中 digit 7,被替換成了 7。樣式匹配到的子串是 7,\(..\) 用於匹配子串,對於匹配到的第一個子串就標記爲 \1,依此類推匹配到的第二個結果就是 \2,
例如: echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/' 
      BBB aaa 
love被標記爲1,所有loveable會被替換成lovers,並打印出來: 
sed -n 's/\(love\)able/\1rs/p' file

7.選定行的範圍 ,

所有在模板test和check所確定的範圍內的行都被打印: sed -n '/test/,/check/p' file 
打印從第5行開始到第一個包含以test開始的行之間的所有行: sed -n '5,/^test/p' file 
對於模板test和west之間的行,每行的末尾用字符串aaa bbb替換: sed '/test/,/west/s/$/aaa bbb/' file
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章