此次博文介紹一下文本處理三劍客中的sed工具(點擊查看grep工具http://www.www58058.com/83512)
介紹sed:
sed是非交互式的編輯器。它不會修改文件,除非使用shell重定向來保存結果。默認情況下,所有的輸出行都被打印到屏幕上。
運行過程:
sed編輯器逐行處理文件,并將結果發送到屏幕。具體過程如下:首先sed把當前正在處理的行保存在一個臨時緩存區中(也稱為模式空間),然后處理模式空間中的行,完成后把該行打印到屏幕上。sed每處理完一行就將其從模式空間刪除,然后將下一行讀入,進行處理和顯示。處理完輸入文件的最后一行后,sed便結束運行。sed把每一行都存在模式空間中,對這個緩存副本進行編輯,所以不會修改原文件。如果沒有對行處理的話,直接把行打印到屏幕上。
sed工具的使用
(1)地址定界:
既然是對文件逐行處理,首先我們決定對哪些行進行編輯,即地址定界,如果沒有指定地址,sed將處理輸入文件的所有行,地址的形式可以是數字、正則表達式、或二者的結合以及其他可以表示指定行的語句。
<1>不指定地址:對全文進行處理
[root@localhost app]#sed -n 'p' test1 1 one 2 ttwo 3 three 4 fffour 5 ffffive
<2>單地址:
#: 指定的行 或 /pattern/:被此處模式(基本正則表達式)所能夠匹配到的每一行
[root@localhost app]#cat test1 #假定一個實驗文件 1 one 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#sed -n '2p' test1 #對指定行處理 2 ttwo [root@localhost app]#sed -n '/\b[a-z]\{4\}\b/p' test1 #支持模式匹配 2 ttwo
<3>范圍地址:
#,# 或 #,+# 或 /pat1/,/pat2/ 或 #,/pat1/
[root@localhost app]#sed -n '2,4p' test1 #第2行到第4hang 2 ttwo 3 three 4 fffour [root@localhost app]#sed -n '2,+2p' test1 #第2行到第2+2行 ...... [root@localhost app]#sed -n '/\b[a-z]\{4\}\b/,/\b[a-z]\{6\}\b/p' test1 #模式匹配行1到模式匹配行2 ...... [root@localhost app]#sed -n '2,/\b[a-z]\{6\}\b/p' test1 #第2行到模式匹配行 ......
其他:
1~2 奇數行 或 2~2 偶數行
[root@localhost app]#sed -n '1~2p' test1 1 one 3 three 5 ffffive [root@localhost app]#sed -n '2~2p' test1 2 ttwo 4 fffour
(2)sed用法:
sed [option]… ‘script’ inputfile…
<1>sed選項:
-n :–quiet, –silent 取消默認自動打印模式空間的行
-e script :–expression=script添加“腳本”到程序的運行列表,可以實現多點編輯
-f 腳本文件 :–file=腳本文件添加“腳本文件”到程序的運行列表,換行鍵入命令可以實現多點編輯
-r :–regexp-extended 支持使用擴展正則表達式
-i.[擴展名] :–in-place[=擴展名] 直接修改文件(如果指定擴展名就備份文件)
-s :–separate 將輸入文件視為各個獨立的文件而不是一個長的連續輸入,可以指定多個文件
[root@localhost app]#sed "2p" test1 #默認打印模式空間 1 one 2 ttwo 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#sed -n "2p" test1 #取消默認打印模式空間 2 ttwo [root@localhost app]#sed -e '2p' -e '3d' test1 #-e 多點編輯 1 one 2 ttwo 2 ttwo 4 fffour 5 ffffive [root@localhost app]#cat test2 2p 3d [root@localhost app]#sed -f test2 test1 # -f 添加文件編輯(文件內換行可以進行多點編輯) 1 one 2 ttwo 2 ttwo 4 fffour 5 ffffive [root@localhost app]#sed -rn '2,/\b[a-z]{6}\b/p' test1 #-r 支持擴展正則表達式 ...... [root@localhost app]#sed -sn '2p' passwd shadow #-s 指定多個文件 bin:x:1:1:bin:/bin:/sbin/nologin bin:*:17400:0:99999:7::: [root@localhost app]#sed -i '2p' test1 #-i 直接對原文件編輯 [root@localhost app]#sed -i.bak '2p' test1 #將原文件備份,直接編輯原文件
<2>sed命令:
sed命令告訴sed如何處理由地址定界指定的輸入行
d 刪除模式空間匹配的行 | a [\]text 在指定行后面追加文本支持使用\n實現多行追加 |
q 結束或者退出sed | i [\]text 在行前面插入文本 |
c [\]text 替換行為單行或多行文本 | c [\]text 替換行為單行或多行文本 |
w /path/somefile 保存模式匹配的行至指定文件 | r /path/somefile 讀取指定文件的文本至模式空間中匹配到的行后 |
= 為模式空間中的行打印行號 | ! 模式空間中匹配行取反處理 |
[root@localhost app]#sed '2q' test1 #到第二行退出sed 1 one 2 ttwo [root@localhost app]#sed '2chello' test1 #將第二行替換為hello 1 one hello 3 three 4 fffour 5 ffffive
[root@localhost app]#sed '2ahello' test1 #在第二行后面添加一行hello 1 one 2 ttwo hello 3 three 4 fffour 5 ffffive
[root@localhost app]#sed '2a\ #反斜杠\ 支持多行輸入 > hello\ > nihao > ' test1 1 one 2 ttwo hello nihao 3 three 4 fffour 5 ffffive
[root@localhost app]#sed '2ihello' test1 #在第二行前面添加一行hello 1 one hello 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#sed '2w /app/test2' test1 #將匹配到的第二行保存至文件 1 one 2 ttwo 3 three 4 fffour 5 ffffive [root@localhost app]#cat test2 2 ttwo [root@localhost app]#sed '3r /app/test2' test1 #將文件內容添加到匹配到的行后面 1 one 2 ttwo 3 three 2 ttwo 4 fffour 5 ffffive [root@localhost app]#sed '=' test1 #在每一行的上面另起一行顯示行號 1 1 one 2 2 ttwo 3 3 three 4 4 fffour 5 5 ffffive [root@localhost app]#sed '2!=' test1 #取反編輯,除了匹配到的行,對其余行進行處理 1 1 one 2 ttwo 3 3 three 4 4 fffour 5 5 ffffive
s/// : 查找替換,默認替換第一個被匹配到的字符串,支持使用其它分隔符,s@@@,s###
替換標記:g :行內全局替換 p :顯示替換成功的行 w :/PATH/TO/SOMEFILE : 將替換成功的行保存至文件中
[root@localhost app]#sed 's/[a-z]/#/' test1 #默認替換匹配行所匹配到的第一個字符串 1 #ne 2 #two 3 #hree 4 #ffour 5 #fffive [root@localhost app]#sed 's/[a-z]/#/g' test1 #-g 匹配行內全局替換 1 ### 2 #### 3 ##### 4 ###### 5 ####### [root@localhost app]#sed -n 's/[a-z]/#/p' test1 #-p 顯示替換成功的行 1 #ne 2 #two 3 #hree 4 #ffour 5 #fffive [root@localhost app]#sed -n 's/[a-z]/#/w /app/test2' test1 #將替換成功的行保存至文件 [root@localhost app]#cat test2 1 #ne 2 #two 3 #hree 4 #ffour 5 #fffive
注意:當匹配模式中含有與分隔符相同的符號時,應當換一種分隔符。總之,避免匹配模式中出現與分隔符相同的符號
比如:
[root@localhost app]#cat test3 123 4/6 7/9 [root@localhost app]#sed '2s///5/' test3 #分隔符與匹配模式相同容易出錯 sed: -e expression #1, char 7: unknown option to `s' [root@localhost app]#sed '2s@/@5@' test3 #換一種分隔符 123 456 7/9
高級編輯命令:
學習之前要了解到模式空間和保持空間,除了sed把當前正在處理的行保存在一個臨時緩存區中的這個模式空間以外,還有一個保持空間(緩沖區、保留空間),默認為空行
h : 把模式空間中的內容覆蓋至保持空間中
H : 把模式空間中的內容追加至保持空間中
g : 從保持空間取出數據覆蓋至模式空間
G : 從保持空間取出內容追加至模式空間
x : 把模式空間中的內容與保持空間中的內容進行互換
n : 讀取匹配到的行的下一行覆蓋至模式空間
N : 讀取匹配到的行的下一行追加至模式空間
d : 刪除模式空間中的行
D : 刪除當前模式空間開端至\n的內容(不再傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
通過具體的例子來學習sed高級編輯命令:
[root@localhost app]#sed 'h;G' test1 #先處理h,把匹配到的行(逐行)覆蓋到保持空間,然后G,將保持空間的數據追加到模式空間,最后打印顯示,這里是默認全部行 1 one 1 one 2 ttwo 2 ttwo 3 three 3 three 4 fffour 4 fffour 5 ffffive 5 ffffive
[root@localhost app]#sed '/one/h;/ttwo/x' test1 #首先處理h,將匹配到的行(one)覆蓋至保持空間,然后處理x,將模式空間中匹配到的行(ttwo)與保持空間的數據互換,最后打印顯示 1 one 1 one 3 three 4 fffour 5 ffffive
[root@localhost app]#sed 'n;d' test1 #先手處理n,將匹配到的行(逐行)的下一行覆蓋至模式空間,然后處理d,將匹配到的模式空間的行刪除,最后打印顯示 1 one 3 three 5 ffffive
[root@localhost app]#sed 'N;D;d' test1 #先手處理N,將匹配到行(逐行)追加到模式空間,然后處理D,刪除模式空間開頭至\n換行的數據,并且不執行后面的命令(;d),同時不打印顯示并重新循環執行sed直至最后 5 ffffive
文本處理三劍客(grep,sed,awk)單獨任何一個都足以寫成一本書,此次介紹如有不足之處,敬請批評指出
原創文章,作者:Mozart,如若轉載,請注明出處:http://www.www58058.com/85364