1、 sed 是一種行/流編輯器,它一次處理一行內容;處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space ),接著用sed 命令處理緩沖區中該行內容,處理完成后,把緩沖區的該行內容送往屏幕,接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出,Sed 可以用來自動編輯一個或多個文件。
2、 sed命令的用法(除非使用-i選項,不改變原文件內容)
1)、用法:sed [option]… 'script' inputfile…
2)、常用選項:
-n:不輸出模式空間所有行的自動打印,而腳本命令p打印模式空間中被腳本指定地址的行,又因為sed命令本身就默認輸出模式空間所有行的自動打印,所有-n選項和腳本命令p的同時使用就只打印模式空間中被腳本指定地址的行
-e:多點編輯
-f /PATH/TO/SCRIPT_FILE:從指定文件中讀取編輯腳本
-r:支持使用擴展正則表達式
-i:原處編輯
例如#sed –i ‘/^U/r /etc/issue’ fi,屏幕無打印顯示,但是修改了原文件fi
#sed –i ‘/^U/r /etc/issue’ fi
屏幕無打印顯示,修改了原文件fi,但是在當前目錄生成了fi原文件備份文件ffi.bak
3)、script(腳本)格式:'地址命令',必須同時包含地址和腳本命令,使用多個腳本命令,中間用;分開
script地址定界:
(1)不給地址:對全文進行處理(默認)
(2)單地址:
#:指定的行
/pattern/:被此處模式所能夠匹配到的每一行
(3)地址范圍:
#,#:從第#行到第#行
#,+#
/pat1/,/pat2/
#,/pat1/
(4)步進:用符號~表示
1~2 奇數行
2~2 偶數行
script編輯命令/腳本命令:
d: 刪除模式空間匹配的行,刪除的模式空間處理行不再在屏幕上顯示
p: 顯示模式空間中的內容
a \text:在行后面追加文本;支持使用\n 實現多行追加
i \text:在行前面插入文本;支持使用\n 實現多行插入
c \text:替換行為單行或多行文本
w /path/to/somefile: 保存模式匹配的行至指定文件
r /path/from/somefile:讀取指定文件的文本至模式空間中匹配到的行后
=: 為模式空間中的行打印行號
!: 模式空間中匹配行取反處理
例如#cat /etc/fstab > fi
#sed ‘3d’ fi,屏幕打印顯示的fi文件內容的第三行被刪除,但是fi文件本身沒有改變
#sed –n ‘3d’ fi,屏幕上無打印輸出
#sed ‘3,6p’ fi,屏幕打印顯示且重復顯示3-6行
#sed –n ‘3,6p’ fi,屏幕打印顯示3-6行
#sed –n ‘1~2p’ fi,屏幕打印顯示奇數行
#sed –n ‘/^U/p’ fi,屏幕打印顯示以U開頭的行
#sed ‘/^U/a \xxhhjjkk’ fi,屏幕打印顯示且以U開頭的行后新行追加文本xxhhjjkk
#sed ‘/^U/a \xxhhjjkk\nbbccddee\nrtrt’ fi
屏幕打印顯示且以U開頭的行后分三行分別追加文本xxhhjjkk、bbccddee、rtrt
#sed ‘/^U/w /testdir/U.txt’ fi
#sed -n ‘/^U/w /testdir/U.txt’ fi, 把文件fi中以U開頭的行存入文件/testdir/U.txt
#sed '/^U/=' fi,打印顯示fi文件中以U開頭的行的行號
#sed '/^U/!=' fi,打印顯示fi文件中非以U開頭的行的行號
4)、s///:查找替換, 支持使用其它分隔符,例如s@@@ ,s###
替換標記:
g:行內全局替換,如果不加g,則僅僅替代行中第一個模式匹配
p:顯示替換成功的行
w /PATH/TO/SOMEFILE:將替換成功的行保存至文件中
ffi文件內容:good good good
xxhhjjkk god god god
例如#sed ‘s/good/god/gp’ ffi,屏幕打印輸出結果是:god god god
xxhhjjkk
但是加上-n選項,輸出結果就是:god god god
#sed ‘s/good/god/gw /root/fffi’ffi,將替換成功的行保存在文件/root/fffi中
5)、示例:
#sed –n ‘2,/root/p’ /etc/passwd 打印顯示第2行到第一個包含有root字符的行
#sed –n –e ‘/^$/p’ –e ‘/^$/=’ file 打印顯示空行及相應的行號(不打印白行及相應行號)
#sed ‘/^$/d’ file 打印顯示刪除所有空行,但是原文件沒有改變
#sed –n‘s/root/&superman/p’ /etc/passwd ,第一個root字符串后添加superman
#sed –n‘s/root/superman&/p’ /etc/passwd ,第一個root字符串前添加superman
#sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets,所有的dog字符串替換成cat字符串,同時
#sed –i.bak ‘s/dog/cat/g’ pets ,修改原文件時備份原文件為pets.bak
3、sed命令的高級編輯命令/高級腳本命令
1)、高級編輯命令:
其中模式空間相當于多工序加工車間,保持空間相當于臨時倉儲倉庫
h: 把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g: 從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x: 把模式空間中的內容與保持空間中的內容進行互換
n: 讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d: 刪除模式空間中的行
D:刪當前模式空間中的行
2)示例:
#sed -n 'n;p' FILE,只打印顯示偶數行(不考慮n選項,起始自動讀第一行進入模式空間,然后判斷腳本命令n,讀取匹配到的第一行的下一行第二行覆蓋至模式空間,而后判斷腳本命令p,默認打印第一行第二行同時再次打印第二行;接著讀取第三行進入模式空間,然后判斷腳本命令n,讀取匹配到的第三行的下一行第四行覆蓋至模式空間,而后判斷腳本命令p,默認打印第三行第四行同時再次打印第四行;依次…;考慮n選項,默認打印不再輸出,所以只打印輸出偶數行)
#sed '1!G;h;$!d' FILE,倒序排列,相當于#tac FILE(第一行不執行G,不是第一行就執行G,然后執行第二條命令h,最后一行不刪除,不是最后一行就刪除;起始自動讀第一行進入模式空間,然后判斷因為是第一行所以不執行G,接著執行第二條命令h,把模式空間中的第一行覆蓋至保持空間,然后判斷因為不是最后一行所以情況模式空間,也就不打印顯示第一行;第二行進入模式空間…)
#sed '$!N;$!D' FILE,只留最后兩行,相當于#tail -2 FILE
#sed '$!d' FILE, 只留最后一行,相當于#tail -1 FILE
#sed ‘G’ FILE,在每行的后面加一空行
#sed ‘g’ FILE,用空行覆蓋每一行
#sed ‘/^$/d;G’ FILE, 刪除所有的空行,然后在每行后加一個空行
#sed 'n;d' FILE,打印顯示奇數行
#sed -n '1!G;h;$p' FILE,倒序排列,相當于#tac FILE
原創文章,作者:18612763863,如若轉載,請注明出處:http://www.www58058.com/31896