流編輯器Sed(Stream Edit)詳解
Grep 、sed 和awk并稱為文本三劍客。使用Grep就可以很好的實現文本查找的功能,而且簡單有效。然而其卻無法直接對其進行編輯,sed的出現便解決了這一問題。
Sed被稱為流編輯器,它是一種新型的非交互式的文本編輯器,它逐行處理文件或輸入,并將結果輸出到屏幕上。Sed編輯沒有破壞性,它默認不會修改文件,除非使用選項主動修改。如果需要進行多項編輯任務,也可以把命令寫在一個叫sed腳本的文件里。
Sed的工作原理
Sed從文件開頭逐行處理文件或輸入,并將結果輸出到屏幕上。Sed 將當前處理的行放在一個叫模式空間的臨時緩存區,在對其進行sed命令編輯后,就將結果輸出到屏幕上(除非sed命令刪除這一行或取消打?。ed每處理完一行就將其從模式空間中刪掉,然后將下一行讀入空間,進行處理和顯示。處理完文件的最后一行后,sed便結束運行。
sed之正則表達式
與grep一樣,sed在文件中查找模式時也要使用正則表達式和各種元字符。正則表達式是括在括在斜桿間的模式,用于查找和替換。
如果要把正則表達式分隔符改成其他字符如c,只要在這個字符前加一個反斜桿,在字符后跟上正則表達式,再跟上這個字符即可,如:
說明,如果斜桿本身是正則表達式的一部分,則需在其前加上反斜桿,以免和作用分隔符的斜桿混淆;或者使用如上方法將分隔符改成其他字符;如:
地址定界
地址定界用于決定對那些行進行編輯,地址的形式可以是數字、正則表達式或二者的結合。如果沒有指定地址,sed 將處理文件中的所有行。定界方法(#代表數字):
無地址 |
對全文進行處理 |
# |
指定的第#行 |
$ |
代表最后一行 |
/PATTERN/ |
被此處模式所能夠匹配到的每一行 |
#1,#2 |
從#1行到#2行 |
#1,+#2 |
從第#1行向下共#2行 |
/PAT1/,/PAT2/ |
從第一個被PATTERN1匹配到的行開始到第 一個被PATTERN2匹配到的行及之間的所有行 |
#,/PATTERN/ |
從第#行開始到第一個能夠PATTERN匹配到的行的所有行 |
~ |
步進; eg. 1~2:奇數行; 2~2:偶數行 |
Sed用法
Sed命令的格式為:sed [OPTION]… {script-only-if-no-other-script} [input-file]…
其中腳本又由地址定界加編輯命令組成,地址定界指明對文件中的哪些行做編輯。編輯命令則說明做什么編輯操作,如增、刪、顯示。
常用選項
-n |
取消默認輸出 |
-e |
允許多項編輯 |
-f FILE |
從指定文件FILE中讀取編輯腳本 |
-r |
支持使用擴展正則表達式 |
-i[SUIFFIX] |
直接編輯原文件,后綴SUFFIX若指明則添加此后綴備份 |
編輯命令
Sed命令告訴sed如何處理由地址界定指定的各輸入行,如果沒有指定地址,sed就會處理所有的行。Sed命令有:
p |
顯示所匹配到的所有行 |
d |
刪除所匹配到的行 |
i \TEXT |
在匹配到的行前面追加新行,內容為TEXT,可使用\n追加多行內容 |
a\TEXT |
在匹配到的行后面追加新行,內容為TEXT,可使用\n追加多行內容 |
c\TEXT |
用新文本TEXT替換匹配到的行 |
w |
將匹配到的行保存至指定文件中;w /PATH/TO/SOMEFILE |
r |
將指定的文件內容追加至匹配到的行后面;r /PATH/TO/SOMEFILE |
= |
在匹配到的行前面顯示行號,行號單獨占據一行 |
! |
取反; eg. 地址定界!編輯命令 |
q |
退出 |
s |
查找并替換,s/PATTERN/STRING/修飾符,模式可用RE,其分隔符可自定義,例如s@@@,s###等等(換行符,反斜線除外)。 STRING:使用字符串定義替換的內容,可使用后向引用\1,\2,…; &:sed支持的元字符之一,引用前面PATTERN所匹配到的所有內容 |
替換標志
p:顯示替換成功的內容;
w /PATH/TO/SOMFILE:將替換成功的內容保存至指定文件當中;
i:查找替換時忽略大小寫;
g:全局替換,默認只替換每行第一個被PATTERN所匹配到的內容;
y:將字符替換為另一字符。
如果要使用多條命令,或者需要在某個地址范圍內嵌套地址,就必須用花括號括起來,每行只寫一個命令;或者用分號分隔一行中的多個命令。
1到5行中包行etc的替換成大寫的ETC,然后把第4行刪除。用-e選項也可實現同樣的效果。
第1至5行先刪除第3行再顯示。
Sed范例
下面以/etc/fstab/文件為例,對sed命令做示范
1、打?。簆命令
命令p是打印,用于顯示模式空間中的內容。默認情況下,sed會把輸入行打印在屏幕上,選項-n可以取消默認打印。因此但選項-n與p命令同時出現時,sed可打印選定的內容。
只打印1到3行
2、多重編輯:-e選項
-e用于進行多重編輯。第一重刪除1-3行,第二重將行首為UUID的行的改成小寫的uuid。因為是逐行進行這兩項編輯,所以編輯的命令順序可能會影響結果。
3、插入:i命令
在含etc的行下加如hello sed,\n表示換行;也可斜桿回車如下圖:
4、讀文件:r命令
在第1行下讀入文件/etc/issue的內容
5、否定命令:!
不刪除包含etc的行。
6、替換:s命令
將所有包含0的行的所有0改成A,并且加g命令全局替換,不加g命令則只替換行里第一個0。
7、退出命令:q
退出命令表示退出,此命令將導致sed程序退出。
打印完第五行后,q命令讓sed退出。
Sed高級命令
Sed執行時逐行將文件內容讀至模式空間,進行編輯后再輸出。然后刪除模式空間,讀入下一條,這樣直至最后一條。但是其實sed還有一個特殊的緩存空間叫保持空間或暫存緩沖區(holding buffer),使用h/H命令可以將模式空間中的內容復制并保存在保持空間,使用共g/G則可以將保持空間中內容放回模式空間,覆蓋,或追加模式空間當前行的后面。這樣便有了sed的一些高級的使用方法。其命令為:
h |
把模式空間中的內容覆蓋至保持空間中 |
H |
把模式空間中的內容追加至保持空間中 |
g |
從保持空間取出數據覆蓋至模式空間 |
G |
從保持空間取出內容追加至模式空間 |
n |
讀取匹配到的行的下一行覆蓋至模式空間 |
N |
讀取匹配到的行的下一行追加至模式空間 |
d |
刪除模式空間中的行,開始下一循環 |
D |
若模式空間無多行則同d;若有,則刪除模式空間所有行,并以此時的模式空間開始下一循環 |
x |
把模式空間中的內容與保持空間中的內容進行互換 |
例:
當讀入到包含etc的行時(第3行),將其放入保持空間,并刪除模式空間的內容;當再讀到包含dev的行時將保持空間中的內容即第3行放入模式空間后面。最后實現將第3行放到組后一行后面。
Sed的高級命令其實還有很多用法,如:
1、sed -n ‘n;p’FILE 顯示偶數行
2、sed ‘1!G;h;$!d’FILE 文件逆序顯示
3、sed ‘$!N;$!D’FILE 顯示文件的最后兩行
4、sed ‘$!d’FILE 打印最后一行
5、sed ‘G’FILE 每行后加一行空行
6、sed ‘g’FILE 每一行換成空白行
7、sed ‘/^$/d;G’FILE 把空白行刪除,并把每行后加一空白行
8、sed ‘n;d’FILE 打印奇數行
9、sed -n ‘1!G;h;$p’FILE 逆序打印
Sed腳本編程
Sed腳本就是放在文件中的一列sed命令,使用選項-f后加文件名讀取腳本文件。Sed腳本中命令格式要求很特別。他要求命令的末尾不能有任何多余的空格或文本。如不命令不能獨占一行,則必須以分號結尾。不能使用引號,除非它是被查找的字符串的一部分。使用反斜桿即可實現換行。
執行腳本時,sed先將輸入文件中的第一行讀入模式空間,然后對其執行腳本中的所有命令。每行處理完畢再讀下一行直至最后一行。如果腳本語法有錯誤,sed腳本就會運行錯誤。范例:
Sed腳本:1如果有包含etc的行則在其下加入文字”this is a…”;2在所有UUID開頭的行下面加一行空白行;3刪除最后一行。
執行結果
原創文章,作者:beyond,如若轉載,請注明出處:http://www.www58058.com/38507