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