文本三劍客之 sed
工作機制:
從文件中分別取出每一行至模式空間(pattern)進行編輯處理,並輸出至屏幕.
命令格式:
sed [option] ‘script’ file_name
option:
-n,--quient,--silent ,靜默模式,不輸出模式空間中的內容.
-i,--in-place ,源文件編輯.
-e ,多點編輯,支持多個編輯命令.
sed -e ‘s/UUID/uuid/’ -e ‘s/#//’ fstab
-f file_name ,指定一個編輯命令文件,與at的-f類似.
-r,--regexp-extended ,支持擴展正則表達式
Script的組成為:”地址定界編輯命令”
地址定界:
1) 單個地址: # 數字,表示指定的單行進行編輯
/pattern/ 表示對被此模式匹配到的行進行編輯
2) 地址範圍: #,# 數字,表示對從#到第#行結束的行進行編輯
#,+# 數字,表示對從第#行開始,到+#行結束的行進行編輯
/pattern1/,/pattern2/ 表示對被第一個/pattern1/匹配的行開始到第一個被
編輯命令:
d ,表示刪除符合條件的行
p ,表示打印符合條件的行
a \text 表示在符合條件的行後追加text文本信息,支持多行 \n
I \text 表示在符合條件的行後插入text文本信息,支持多行
C \text 表示把符合條件的行更改為text,註意:更改的整行,區別s
w /some/to/file_name 把符合條件的行寫入到指定文件中
r /some/to/file_name 把文件寫入到符合條件的行前。
sed ‘1r /etc/issue’ /etc/fstab #將issue文件寫入到fstab之前
= 顯示模式空間中的行號
! 對地址空間進行取反
s/// 查找替換,支持s@@@, s###
替換標記:
g 表示替換
& 表示後向應用整體
sed ‘s/r..t/&er/’ /etc/passwd #查找字符”r..t”並在尾部加er
練習:
1) 刪除/etc/grub.conf文件中所有以空白字符開頭的行的行首空白字符。
sed ‘s/^[[:space:]]\+//’ /etc/grub.conf
2) 刪除/etc/fstab文件中所有以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符
Sed ‘s/^#[[:space:]]\+//’ /etc/fstab
3) Echo一個絕對路徑,取基名與目錄名。
目錄名: echo “/etc/sysconfig/123” | sed ‘s/[^/]\+$//’
基名: echo “/etc/sysconfig/123” | sed ‘s@^/.*/@@’
高級命令:
h hold,將模式空間中的內容覆蓋至保持空間
H 將模式空間中的內容追加至保持空間
g get,將保持空間中的內容覆蓋至模式空間
G 將保持空間中的內容追加至模式空間
x 將模式空間與保持空間中的內容交換
n 將符合條件的行的下一行覆蓋至模式空間
N 將符合條件的行的下一行覆蓋至模式空間,此時模式空間存在多行
d 刪除模式空間中的單行
D 刪除模式空間中的多行
p 打印符合條件的行
典型應用:
Sed -n ‘n;p’ file #顯示偶數行
Sed ‘n;d’ file #顯示奇數行
Sed ‘1!G;h;$!D’ file #將文件倒序輸出,類似於tac
Sed ‘$!N;$!D’ file #顯示文件的倒數兩行
Sed ‘G’ file #在每行之後插入空白行
Sed ‘/^$/d;G’ file #將多行空白替換為一行
文本三劍客之 sed