一、sed 流編輯器,實現對文字的增刪改替換查(過濾、取行),能同時處理多個文件多行的內容,能夠不對原文件改動,把整個文件輸入到屏幕,能夠把只匹配到模式的內容輸入到屏幕上。還能夠對原文件改動,可是不會再屏幕上返回結果。html
流程:Sed軟件從文件或管道中讀取一行,處理一行,輸出一行;再讀取一行,再處理一行,再輸出一行……正則表達式
模式空間:sed軟件內部的一個臨時緩存,用於存放讀取到的內容。緩存
二、命令格式:sed [選項] [命令] [輸入文件]bash
sed命令的經常使用選項:app
-n :只打印模式匹配的行,通常與 p 一塊兒使用。如:sed -n ' 2p ' /data 表示輸出/data的第二行,如:sed -n '20,30p' /data/boy顯示 /data/boy的20到30行。編輯器
-e :進行多項編輯,即對輸入行應用多條sed命令時使用,此爲默認選項。如:sed -e '/^#/d' -e '/^$/d' /data/boy表示刪除空格的行和#開頭的行。ide
-f :將sed的動做寫在一個腳本文件內,用–f filename 執行filename內的sed動做。spa
-r :支持擴展表達式code
-i :直接修改文件內容,如:sed -i s#old#new#g orm
經常使用基本命令:
d :delete, 刪除匹配到的行;
r /file :read, 將指定文件的內容讀取至當前模式空間中被匹配到的行後面,經常使用於實現文件合併;
sed -i '/Ethernet/r myfile' test 匹配Ethernet的行,讀進來另外一個文件的內容,讀進來的文件的內容會插入到匹配Ethernet的行後
y:用於(對應)轉換字符;
三、sed在文件中查詢文本的方式
x/p |
查詢第x行 |
sed -n '2p ' /data |
x,y/p | 查詢從x到y行 | sed -n '1,3p ' /data |
/pattern/p | 查詢包含pattern的行 | sed -n '/pattern/p' /data |
/pattern 1/,/pattern 2/p | 查詢包含pattern 1或pattern 2的行 | sed -n '/pn1/,/pn2/p' /data |
/pattern/,xp | 查詢從包含pattern的行到x行 |
sed -n '/pn/,5p' /data |
x,/pattern/p | 查詢從x到包含pattern的行 | sed -n '5,/pn/p' /data |
x,y!p | 查詢不包含指定行號x和y的行 | sed -n '5,8!p' /data |
10{sed-commands} 對第10行操做
10,20{sed-commands} 對10到20行操做,包括第10,20行
10,+20{sed-commands} 對10到30(10+20)行操做,包括第10,30行
1~2{sed-commands} 對1,3,5,7,……行操做
10,${sed-commands} 對10到最後一行($表明最後一行)操做,包括第10行
/oldboy/{sed-commands} 對匹配oldboy的行操做
/oldboy/,/Alex/{sed-commands} 對匹配oldboy的行到匹配Alex的行操做
/oldboy/,${sed-commands} 對匹配oldboy的行到最後一行操做
/oldboy/,10{sed-commands} 對匹配oldboy的行到第10行操做,注意:若是前10行沒有匹配到oldboy,sed軟件會顯示10行之後的匹配oldboy的行,若是有。
1,/Alex/{sed-commands} 對第1行到匹配Alex的行操做
/oldboy/,+2{sed-commands} 對匹配oldboy的行到其後的2行操做
四、案例(sed 後不跟 -i 表示僅對輸出改變,對源文件不改變)
單行增長到第2行後: sed '2a 106,dandan,CSO' person.txt
單行增長到第2行前: sed '2i 106,dandan,CSO' person.txt
多行增長到第2行前: sed '2i 106,dandan,CSO\n107,bingbing,CCO' person.txt,每行之間加換行符 \n
刪除第二行: sed '2d' person.txt
刪除匹配oldboy或者Alex的行 sed '/oldboy/,/Alex/d' person.txt
用新行替代第2行 sed '2c 106,dandan,CSO' person.txt
分組替換\( \)和\1的使用說明
sed軟件的\( \)
的功能能夠記住正則表達式的一部分,其中,\1
爲第一個記住的模式即第一個小括號中的匹配內容,\2
第二記住的模式,即第二個小括號中的匹配內容,sed最多能夠記住9個。
例:echo I am oldboy teacher.
若是想保留這一行的單詞oldboy,刪除剩下的部分,使用圓括號標記想保留的部分。
echo I am oldboy teacher. |sed 's#^.*am \([a-z].*\) tea.*$#\1#g'
思路:用oldboy
字符替換I am oldboy teacher.
下面解釋用□
代替空格:
^.*am□
–>這句的意思是以任意字符開頭到am□
爲止,匹配文件中的I am□
字符串;
\([a-z].*\)□
–>這句的外殼就是括號\(\)
,裏面的[a-z]
表示匹配26個字母的任何一個,[a-z].*
合起來就是匹配任意多個字符,本題來講就是匹配oldboy
字符串,因爲oldboy
字符串是須要保留的,所以用括號括起來匹配,後面經過\1
來取oldboy
字符串。
□tea.*$
–>表示以空格tea
起始,任意字符結尾,實際就是匹配oldboy
字符串後,緊接着的字符串□teacher.
;
後面被替換的內容中的\1
就是取前面的括號裏的內容了,也就是咱們要的oldboy
字符串。
()
是擴展正則表達式的元字符,sed軟件默認識別基本正則表達式,想要使用擴展正則須要使用\
轉義,即\(\)
。sed使用-r
選項則能夠識別擴展正則表達式,此時使用\(\)
反而會出錯。