1. SED簡介
sed 是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩衝區中,稱爲“模式空間”(pattern space),接着用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往屏幕。接着處理下一行,這樣不斷重複,直到文件末尾。文件內容並沒有 改變,除非你使用重定向存儲輸出或者配合編輯選項使用。Sed主要用來自動編輯一個或多個文件;簡化對文件的反覆操作;編寫轉換程序等。以下介紹的是Gnu版本的Sed 3.02。
2.SED工作模式
讀取一行內容——>編輯此行內容——>輸出編輯後的結果,並清空模式空間——>讀取下一行內容
3.用法:sed OPTIONS... [SCRIPT] [INPUTFILE...]
-r: 使用擴展的正則表達式;
例如:# sed -n -r '/^(dev|tmp)/p' /tmp/fstab.txt
-n, --quiet, --silent: 不輸出模式空間的內容;【即:只是輸出被匹配到的內容】
例如:# sed -n '1,3p' /etc/fstab
# sed -n '1,3d' /etc/fstab
-i:直接編輯原文件;
例如:# sed -i '3,7d' /tmp/fstab.txt
-e: -e '' -e '' -e ''
'CMD1;CMD2;CMD3'
例如:# sed -e 's/UUID/uuid/g' -e 's/proc/PROC/g' /tmp/fstab.txt
-f /path/to/sed_script:從指定的文件讀取處理腳本
例如:
# vim sed.script
s/UUID/uuid/g
s/proc/PROC/g
3d
# sed -f sed.script /tmp/fstab.txt
4.地址定界:
可以通過定址來定位你所希望編輯的行,該地址用數字構成,用逗號分隔的兩個行數表示以這兩行爲起止的行的範圍(包括行數表示的那兩行)。如1,3表示1,2,3行,美元符號($)表示最後一行。範圍可以通過數據,正則表達式或者二者結合的方式確定 。
具體用法如下:
#: 指定行
例如:# sed '10d' /etc/fstab
驗證對比:# cat -n /etc/fstab
$: 最後一行
例如:# sed '$d' /etc/fstab
/regexp/:任何能夠被regexp匹配到的行
例如:刪除以#開頭的行:# sed '/^#/d' /etc/fstab
\%regexp%: 任何能夠被regexp匹配到的行;換用%爲邊界符號;
例如:# sed '/^\/dev\/mapper/d' /etc/fstab
或# sed '\@^/dev/mapper/@d' /etc/fstab
或# sed '\%^/dev/mapper/%d' /etc/fstab
/regexp/I
\%regexp%I:匹配時忽略字符大小寫;
addr1, addr2: 指定範圍內的所有行:
0,/regexp/
#,#
/regexp/,/regexp/
#,+#
first~step:指定起始位置,以及步長
5.基本正則表達式元字符:
字符:. [] [^]
次數:*, \+, \?, \{i,j\}
分組:\(\)
錨定:^, $, \<, \>
或者:\|
後向引用:\1, \2, ...
6.編輯命令:
注意:命令之前可以使用!表示取反操作;
=: 顯示行號【被匹配到的行的行號】
# sed -n '\%/dev/mapper%=' /etc/fstab
# sed -n '\/^[[:upper:]]/=' /etc/fstab
d: 刪除匹配到的行;
p: 打印模式空間中的內容;
例如:# sed '1,3p' /etc/fstab 【1-3行會重複;因爲默認1-3打印一次,加上p命令,再次打印,所以會重複】
通常與-n選項一同使用;
# sed -n '1,3p' /etc/fstab
a \text: append,
a \text1\ntext2\ntext3: 附加多行文本
例如:# sed '/^[[:upper:]]/a \# Upper letters' /etc/fstab
# sed '/^[[:upper:]]/a \# Upper letters\n# test text' /etc/fstab
i \text:insert,
i \text1\ntext2: 插入多行文本 【插入到匹配到的行之前】
例如:# sed '/^[[:upper:]]/i \# Upper letters\n# test text' /etc/fstab
c \text: change,把匹配到的行替換爲給定的文本
例如:# sed '3c \substitue text' /etc/fstab
s///: 替換命令
# sed 's\UUID\uuid\' /etc/fstab
g: 全局替換
i: 不區分大小寫
p: 如果成功替換則打印
w /path/to/somefile: 將替換後的結果保存至指定文件中
例如:# sed 's/tmpfs/TMPFS/gw /tmp/sed.txt' /etc/fstab
# cat /tmp/sed.txt
w /path/to/somefile:將匹配到文件另存至指定文件中
例如:# sed '3,7w /tmp/fstab.txt' /etc/fstab
# cat /tmp/fstab.txt
r /path/from/somefile:讀取指定文件至匹配到的行處
例如,將/etc/issue插入到UUID之後
# sed '\/UUID/r /etc/issue' /etc/fstab
7.練習
練習1:刪除/boot/grub/grub.conf文件中所以空白開頭的行行首的空白;
sed 's/^[[:space:]]\+//g' /boot/grub/grub.conf
練習2:刪除/etc/fstab文件中所有以#開頭,後跟至少一個空白字符的行的行首的#和空白字符;
sed 's/^#[[:space:]]\+//' /etc/fstab
練習3:echo一個文件路徑給sed命令,取出其基名;取出其目錄名;
# echo "/etc/sysconfig/" | sed 's@[^/]\{1,\}/\?$@@g'
解析:[^/]\{1,\}爲非斜線字符出現至少一次
練習4:替換/etc/inittab文件“id:數字:initdefault:”一行中的那個數字爲6;
# sed 's@id:[0-9]:initdefault:@id:6:initdefault@' /etc/inittab
8.高級編輯命令:
h: 用模式空間中的內容覆蓋保持空間中的內容;
H:把模式空間中的內容追求至保持空間;
g: get, 從保持空間取回數據至模式空間,覆蓋模式空間中原有
G:GET, 從保持空間取回數據至模式空間,追加於模式空間中現
x: 把模式空間和保持空間中的內容進行交換;
n: 讀取匹配到的行下一行至模式空間;
N: 追加讀匹配到的行下一行至模式空間;
d: 刪除模式空間中的內容;
D:刪除多行模式空間中首行;
9.常用用法【高級命令】
sed '1!G;h;$!d' FILE
顯示文件的偶數行:sed -n 'n;p' FILE; sed -n '2~2p' FILE
1
2
3
4
顯示文件的奇數行:sed -n 'p;n' FILE; sed -n '1~2;p' FILE
10.高級命令練習
練習1:用sed將文件的奇數行與偶數行
# sed '$!N;s@\n@\&\&@g' /etc/issu
練習2:說明以下sed命令的意義:
(1) sed '$!N;$!D' /etc/issue
(2) sed '$!d' /etc/issue
(3) sed 'G' /etc/issue
(4) sed '/^$/d;G' /etc/issue
(5) sed 'n;d' /etc/issue
(6) sed -n '1!G;h;$p' /etc/issue