sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。然後讀入下行,執行下一個循環。如果沒有使諸如‘D’的特殊命令,那會在兩個循環之間清空模式空間,但不會清空保留空間。這樣不斷重複,直到文件末尾。文件內容並沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件,簡化對文件的反覆操作,編寫轉換程序等。
sed和文本處理工具vim、grep是有區別的,vim是一種交互式的文本編輯工具,而sed是一種非交互式的文本編輯器(通過給定的條件自動的逐行去處理文件);grep雖然也是一種流式的文本處理工具,但grep是用來檢索條件關鍵字的,而sed卻是搜索匹配處理文本工具。
sed所具有的功能有:數據的替換、刪除、新增等,這裏的數據可以是一些關鍵字,也可以是一些特定的行。
1、sed的語法結構:
sed [OPTION]... {script} {input-file}...{actions}
常用選項:
-n:不輸出模式空間內容到屏幕,即不自動打印,即靜默模式
-e script 1 -e script 2 -e script 3:指定多腳本運行
-f:/PATH/SCRIPT_FILE: 從指定的文件中讀取腳本並運行
-r:支持使用擴展正則表達式
-i:備份文件並原處編輯;直接修改源文件
script: '地址命令'
2、sed的地址定界(抽取的域):
(1) 不給地址:對全文進行處理
(2) 單地址:
#: 指定的行
$:最後一行
/pattern/:被此處模式所能夠匹配到的每一行
%patten%:同上,只不過換作%爲邊界符
(3) 地址範圍:
startline,endline:
#,#:從#行到#行
#:#:表示數字,指定行
#,+#:從#行開始,一直到向下的#行
/pat1/,/pat2/:從第一次被/pat1/匹配到的行開始,到第一次被/pat2/匹配到的行結束,中間的所有行
#,/pat1/:從#行開始,到第一次被/pat/所匹配的行結束,中間所有的行
(4) ~:步進
1~2 奇數行
2~2 偶數行
first~step:指定起始行,已經步長
3、sed的編輯命令
d:刪除模式空間匹配的行,並立即啓用下一輪循環 p:打印當前模式空間內容,追加到默認輸出之後 a \text:在指定行後面追加文本,支持使用\n實現多行追加 i \text:在指定行前面插入文本,支持使用\n實現多行插入 c \text:用text替換匹配的單行或多行文本 w /path/somefile: 保存模式匹配的行至指定文件;把指定的內容另存爲/path/somefile路徑所指定的文件中 r /path/somefile:讀取指定文件的文本至模式空間中匹配到的行後;在文件的指定位置插入另一文件的所有內容,完成文件合併 =: 爲模式空間中的行打印行號 !:模式空間中匹配行取反處理 s/regexp/replacement/:替換由regexp所匹配到的內容爲replacement(支持使用其他分隔符,如:s@@@,s###;條件是該分隔符在後面 的模式中沒有出現過),對於替換還有兩個後選項g和i,分別表示如下: 替換標記: g:行內全局替換; i:不區分大小寫 p:顯示替換成功的行 w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
示例:
(1)刪除/app/grub.conf文件中所有行的行首的空白字符
sed 's/^[[:space:]]//' grub.conf
(2)刪除/app/grub.conf文件中所有以#開頭,後跟至少一個空白字符的行的行首的#和空白字符
sed 's/^#[[:space:]]\+//g' /etc/fstab
(3)把/app/grub.conf文件的奇數行另存爲/app/grub.conf.3
(4)echo 一個文件路徑給sed命令,取出其基名;進一步地,取出其路徑名;
目錄名:echo '/etc/fstab' |sed -nr 's@(.*/)(.*$)@\1@p'
基名:echo '/etc/fstab' |sed -nr 's@(.*/)(.*$)@\2@p'
4、sed的高級編輯命令
sed除了“模式空間”(patten space),還有一個“hold space”的內存空間,稱之爲保持空間。
sed工具支持一些高級的命令來運用到保持空間當中,高級命令有:
P:打印模式空間開端至\n內容,並追加到默認輸出之前 h: 把模式空間中的內容覆蓋至保持空間中 H:把模式空間中的內容追加至保持空間中 g: 從保持空間取出數據覆蓋至模式空間 G:從保持空間取出內容追加至模式空間 x: 把模式空間中的內容與保持空間中的內容進行互換 n: 讀取匹配到的行的下一行覆蓋至模式空間 N:讀取匹配到的行的下一行追加至模式空間 d: 刪除模式空間中的行 D:如果模式空間包含換行符,則刪除直到第一個換行符的模式空間中的文本,並不會讀取新的輸入行,而使用合成的模式空間重新啓動循環。 如果模式空間不包含換行符,則會像發出d命令那樣啓動正常的新循環
注意:命令功能可使用!分號可用於分隔腳本
示例:
seq 1 8 |sed -n 'n;p' 輸出偶數行
seq 1 10 |sed '1!G;h;$!d' 或 seq 1 10 |sed -n '1!G;h;$p' 倒序輸出
seq 1 10 |sed 'N;D' 或 seq 1 10 |sed '$!d' 只輸出最後一行
seq 1 10 |sed '$!N;$!D' 輸出倒數後兩行
seq 1 10 |sed 'G' 每行後加一個空行
seq 1 10 |sed 'g' 所有行變爲空行
cat seq.txt |sed '/^$/d;G' 空行刪除,每行後加一個空行,即保證每行後只有一個空行
seq 1 10 |sed 'n;d' 只顯示奇數行
5、收集的一些命令集:
's/\.$//g' 刪除以句點結尾行 '-e /abcd/d' 刪除包含abcd的行 's/[][][]*/[]/g' 刪除1個以上空格用1個空格代替 's/^[][]*//g' 刪除行首空格 's/\.[][]*/[]/g' 刪除句點後跟2個或更多空格,以一個空格代替 '/^$/d' 刪除空行 's/^.//g' 刪除第一個字符 's/COL\(...\)//g' 刪除緊跟COL的後三個字母 's/^\///g' 從路徑中刪除第一個\ 's/[]/[]//g' 刪除所有空格並用tab鍵代替 's/^[]//g' 刪除所有行首的tab鍵 's/[]*//g' 刪除所有tab鍵
作業:
1、在centos6系統/root/install.log每一行行首增加#號
sed 's/^/#/g' /root/install.log
2、在/etc/fstab文件中不以#開頭的行的行首增加#號
sed 's/^[^#]/#/' /etc/fstab
3、利用sed取出ifconfig命令中本機的IPv4地址
ifconfig |sed -nr '2s@^[[:blank:]]+inet[[:blank:]](([0-9]{1,3}\.){3}[0-9]{1,3}).+@\1@p'
4、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重複次數
ls /media/Packages/*.rpm |sed -r 's/.*\.(.+)\.rpm$/\1/' |sort |uniq -c
5、統計/etc/init.d/functions文件中每個單詞的出現次數,並排序(用grep和sed兩種方法分別實現)
cat /etc/init.d/functions |sed -r "s/[^[:alpha:]]/\n/g" |sort |uniq -c |sort -nr
6、將文本文件的n和n+1行合併爲一行,n爲奇數行
seq 10 | sed "1~2N; s/\n/ /"