sed工具:sed是文本流編輯器,逐行對檔案的内容進行處理
用法:sed [option] ... 'script' inputfile...
選項:
-n:靜默模式,不輸出模式空間的内容至螢幕
-e:實作多點的功能編輯
-f /path/from/script_file:從指定的檔案讀取編輯腳本
-r:支援使用擴充的正規表達式
位址界面方法:
(1)不給位址:對全文進行處理
(2)一個位址(單位址)
#:指定的行
/pattern/:被引用處模式所能夠比對到的每一行:
(3)位址範圍
#,#:從第幾行到第幾行
#,+#:顯示從第幾行開始向後的N行
/pat1/,/pat2/:同時比對2個參數,表示比對這2個參數之間的所有行
#,/pat1/:表示比對這2個參數之間的所有行
(4)~:步進
#sed -n ‘1~2p’ test.txt(第一行開始,每次增加2行,意思就是顯示奇數行)
#sed -n ‘2~2p’ test.txt(從第二行開始顯示,每次增加2行,意思就是顯示偶數行)
編輯指令:
d:删除被位址界定標明的内容
p:顯示(列印)模式空間中的内容到螢幕上,隻列印符合條件的行,常于-n結合一起使用
a \text:在行後面一行追加文本:支援使用\n實作多行追加;
例: #sed '/^T/a \abc' a.txt
i \text:在行前面一行追加文本:支援使用\n實作多行追加;
例:# sed '/^T/i \abc' a.txt
c \text:替換比對到的行:
例:# sed '/^T/c \abc' a.txt
w /path/to/somefile:儲存模式空間中比對到的内容至指定檔案中;
r /path/from/somefile:讀取指定檔案的文本遊戲 至模式空間中比對到的行後;
=:為模式空間中的行,列印行号;
例:#sed -n '/^T/=' a.txt
q:一旦比對到内容,則退出;不再往下比對
!:取反條件;對除了模式比對到的行以外的行,進行操作;
s///:支援使用其它分隔符,s@@@,s###
替換标記:
#:行内替換,替換第幾次出現的比對的内容,例:sed -n 's/Unix/UNIX/2p' a.txt,把第2次出現的Unix替換
p:如果替換成功,則顯示替換成功的行,與-n一起使用
w /path/to/somefile:将替換成功的行儲存至指定檔案中
練習1:删除/boot/grub/grub.conf檔案中所有以空白開頭的行行首的空白字元
#sed 's@^[[:space:]]\+@@' /boot/grub/grub.conf
練習2:删除/etc/fstab檔案中所有以#開頭,後面至少跟一個空白字元的行的行首的#和空白字元
#sed 's@^#[[:space:]]\+@@' /etc/fstab
練習3:echo一個絕對路徑給sed指令,取出其基名:
#echo "/etc/sysconfig" | sed 's@[^/]\+$@@'
練習4:批量修改檔案名字
#ls *.jpg | sed 's#\(.*\)_finished\(.*\).*#mv & \1\2#g' | bash
進階編輯指令:
h:把模式空間中的内容覆寫至保持空間中;
H:把模式空間的内容追加至保持空間中;
g:從保持空間取出資料覆寫至模式空間;
G:從保持空間取出資料追加至模式空間;
x:把模式空間中内容與保持空間中的内容進行互換操作;
n:讀取比對到的行的下一行覆寫至模式空間;
N:讀取比對到的行的下一行追加至模式空間;
d:删除模式空間中的所有行;
D:删除多行模式空間中的第一行;
示例用法:
#sed -n ‘n;p’ test.txt(輸出偶數行)
#sed ‘n;d’ test.txt(隻顯示奇數行)
#sed ‘$!d’ test.txt(最出檔案最後一行)
#sed ‘G’ test.txt(在每一行下面加一個空白行)
#sed ‘/^$/d;G’ test.txt(每行間隻保留一個空白行)
#sed '1!G;h;$!d' test.txt(逆行顯示檔案内容)
#sed ‘$!N;$!D’ test.txt(讀檔案的後2行)
#sed -n ‘1!G;h;$p’ test.txt(逆行顯示檔案内容)
保持空間使用的一個例子:
需求:把單詞the和statement之間的單詞的全部改為大寫
原文:
find the Match statement
consult the Get statement
using the Read statement to retrieve data
sed寫法:
/the .*statement/{
h
s/.*the \(.*\)statement.*/\1/
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
G
s/\(.*\)\n\(.*the \).*\( statement.*\)/\2\1\3/
}
結果:
find the MATCH statement
Consult the GET statement
using the READ statement to retrieve data
解析:
/the .*statement/:比對這種模式的行,然後進行修改
h:将比對到的内容覆寫至保持空間,保留一份複本
s/.*the \(.*\)statement.*/\1/:在模式空間中将比對到行轉換為要改變的單詞
y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/:将修改後的單詞轉換為大寫
G:把保持空間的複本追加到模式空間
s/\(.*\)\n\(.*the \).*\( statement.*\)/\2\1\3/:将修改為大寫的單詞替換到原語句中的單詞
從這個腳本可以看出,靈活的使用保持空間對于隔離和操作輸入行的某部分内容很有用
本文轉自激情燃燒的歲月部落格51CTO部落格,原文連結http://blog.51cto.com/liuzhengwei521/1883236如需轉載請自行聯系原作者
weilovepan520