sed:stream Editor流編輯器,默認不編輯原文件,僅對模式空間中的數據做處理;而後,處理結束後,將模式空間打印至屏幕。
語法:
sed [option] 'AddressCommand' file1 file2...
option選項有:
-n :靜默模式,不再顯示模式空間的內容
-i :直接修改源文件
-r :使用擴展正則表達式
Address常用的匹配範圍:
1、startLine,endLine
如:1,100 表示從第一行到100行,$表示最後一行
2、/RegEXP/ 正則匹配,將匹配到的行顯示出來
如:/root/ 將匹配到有root的行顯示
3、/pattern1/,/pattern2/,從第一次匹配到pattern1開始到匹配到pattern2的行結束的中間的行
4、LineNumber匹配指定的行
5、startLine,+N,從startLine開始,往後的N行
command常用命令
d:刪除匹配到的行
p:顯示符合條件的行
a \string :在匹配當的行後面追加string的內容
i \string : 在匹配當的行前面添加string的內容
r file :將file文件的內容添加到匹配到的行出
w file :將匹配到的行添加到file文件中
s/pattern/string/修飾符 :將匹配到的pattern替換成string,默認是替換第一個被匹配到的
常用的修飾符有:
i :忽略大小寫
g :全局替換
如:
1、刪除/etc/grub.conf文件中行首的空白符;
sed -r 's@^[[:spapce:]]+@@g' /etc/grub.conf
2、替換/etc/inittab文件中"id:3:initdefault:"一行中的數字爲5;
sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab
3、刪除/etc/inittab文件中的空白行;
sed '/^$/d' /etc/inittab
4、刪除/etc/inittab文件中開頭的#號;
sed -r 's@^#@@g' /etc/inittab
5、刪除某文件中開頭的#號及後面的空白字符,但要求#號後面必須有空白字符;
sed -r 's@^#[[:space:]]+@@g' /etc/inittab
6、刪除某文件中以空白字符開頭後面跟#類的行中的開頭的空白字符及#號
sed -r 's@^[[:space:]]+#@@g' /etc/inittab
7、取出一個文件路徑的目錄名稱;如取出/etc/inittab文件的目錄,即/etc
##echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
echo '/etc/inittab' | sed -r 's#^(/.*)/(.*)#\1#'
基名/文件名:
echo "/etc/rc.d/" | sed -r 's@^/.*/([^/]+)/?@\1@g'
echo '/etc/inittab' | sed -r 's#^(/.*)/(.*)#\2#'
需要注意的是,如果要替換原文見的內容要加 -i 參數,sed 中的///,可以使用###或@@@等字符代替。
p的 command參數也要注意下,匹配到的行將會顯示兩次,沒匹配到的顯示一次,如果顯示兩次的,第一次是 p的的作用將匹配到的行打印出來,第二次是sed命令的作用,會將模式空間的內容顯示出來,所以說沒匹配到的也會顯示一次,如果想只顯示一次可以加 -n 參數,那麼sed命令中模式空間的內容不顯示。