1. 簡介
sed是一種在線編輯器、行編輯器,一次處理一行內容,在處理時,把當前的行存儲到臨時緩衝區中,該緩衝區稱爲"模式空間"(pattern space),接着用sed命令處理緩衝區中的內容,處理完畢後,把緩衝區的內容送到標準輸出;然後緊接着去處理下一行,重複完成相同的操作,直至文件末尾;sed處理的整個過程中,對象文件中的內容並沒有改變,除非使用重定向來存儲處理後的結果。sed主要用來自動編輯一個或多個文件,簡化文件的反覆操作過程。
流程如下圖:
2. sed命令功能
sed [OPTION]... {script-only-if-no-other-script} [input-file]...
- 常用選項:
-n:表示不輸出模式空間中內容至屏幕 -e script1 -e script2 -e script3:多點編輯 -f /path/to/script_file:從指定的文件中讀取腳本並運行 -i:直接修改源文件 -r:支持擴展正則表達式
- script:地址定界 編輯命令
1.地址定界
(1)空地址:對全文進行處理
(2)單地址:
#:指定行
/pattern/:指此模式所匹配到每一行
(3)地址範圍:
#,#:表示數字,指定行
$:最後一行
#,/regexp/:從#開始,到第一次被/regrexp/所匹配到的行結束,中間的所有行
/regexp1/,/regexp2/:從第一次被/regexp1/所匹配到的行開始,到第一次被/regexp2/匹配到的行結束,中間所有的行
(4)步進:
1~2:所有奇數行
2~2:所有偶數行
2.編輯命令:
d:刪除模式空間的行
p:顯示模式空間的內容
a\text:在行後面追加文本,支持使用\n實現多行追加
i \text:在行前面插入文本,支持使用\n實現多行插入
c\text:用text替換匹配到的行
w /path/to/somefile:把指定內容另存至/path/to/somefile路徑所指定的文件中
r /path/tp/somefile:在文件的指定位置插入另一個文件的所有內容,完成文件合併br/>s/regexp/replacement/:替換由regexp所匹配到內容爲replacement
(支持使用其他分隔符如s@@@,s###;條件是該分隔符在後面的模式中
沒有出現過),對於替換還有2個後選項g和i,分別表示如下:
g:全局替換
i:不區分大小寫
3.常用命令功能演示:(1)顯示/etc/fstab第3行內容: ` sed -n '3p' /etc/fstab` (2)顯示/etc/fstab第3至6行內容: ` sed -n '3,6p' /etc/fstab` (3)顯示/etc/fstab奇數行內容: `sed -n '1~2p' /etc/fstab` (4)顯示/etc/fstab的最後一行 ` sed -n '$p' /etc/fstab` (5)刪除/boot/grub2/grub.cfg文件中所有行的行首的空白字符 ` sed 's/^[[:space:]]\+//g' /boot/grub2/grub.cfg` (6)刪除/boot/grub2/grub.cfg文件中所有以#開頭,後跟至少一個空白字符的行的行首的#和空白字符: ` sed 's/^#[[:space:]]\+//g' /boot/grub2/grub.cfg` (7)把/tmp/grub.cfg的文件的奇數行另存爲/tmp/grub.cfg3 ` sed '1~2w /tmp/grub.cfg3' /tmp/grub.cfg` (8)echo一個文件路徑取出其基名,進一步取出其路徑名 如:取出路徑名:`echo "/etc/sysconfig/network-scripts/" | sed -r 's@[^/]+/?$@@'` 取出基名:`echo "/etc/sysconfig/network-scripts/" | sed 's@^.*/\([^/]\+\)/\?$@\1@'`
4.sed的高級用法
sed除了模式空間(pattern space)還有一個"hold space"的內存空間,稱之爲保持空間
高級編輯命令:
h:用模式空間中的覆蓋保持空間的內容
H:把模式空間中的內容追加至保持空間中的內容的後面
g:從保持空間的取到的內容,並將其覆蓋模式空間中的內容
G:從保持空間中取到的內容,並將其追加在模式空間中的內容的後面
x:把保持空間和模式的內容進行互換
n:讀取匹配到的行的下一行至模式空間,(會覆蓋模式空間中的原有內容)
N:讀取匹配到的下一行至模式空間,追加在模式空間中原有內容的後面
d:刪除模式空間的內容
D:刪除多行模式空間中的首行
注意:命令功能可使用!取反,分號可用於分隔腳本
示例:sed -n 'n;p' FILE:顯示偶數行 sed '1!G;h;$!d' FILE:逆序顯示文件 sed '$!d' FILE:取出最後一行 sed '$!N,$!D' FILE:顯示最後兩行 sed '/^$/d;G' FILE:保證指定的文件每一行後有且僅有一個空白行 sed 'n;d' FILE:顯示奇數行 sed 'G':在文件中的每行都加空白行