1 sed 又稱爲流編輯器,它逐行將文本文件中的行讀取到模式空間中間去,將符合編輯條件的行進行編輯後輸出到顯示器上來。默認sed不編輯原文件只處理模式空間中的內容。
2 sed用法
sed [option]'addresscommand[修飾符]' file
2.1 option
-n 採用靜默模式,所謂靜默模式就是隻輸出被匹配到的行,不在默認顯示模式空間中內容
-i 直接修改原文件
-r 使用擴展的正則表達式
-e 同時連接多個 sed 命令
如sed -e '$a \this is end ' -ne '/\<if\>/p' /etc/rc.d/rc 此時就是同時使用了兩個sed,
-f 其後接一個文件(文件中保存的內容全是 addresscommand )
2.2 address 搜索範圍
1 指定單獨某行 進行精確匹配
2 指定某行至某行 如 3,5 表達3-5行
3 3,+N 表示第三行後再接N行
4 /正則表達式/ 表示正則表達式中匹配到的行
5/正則表達式1/,/正則表達式2/ 表示第一次被正則表達式1匹配到的行和被正則表達式2匹配到的行之間的行。
2.3 command 編輯命令
d delete 刪除
p printf 打印
a \string 在匹配到行的下面新建一行將string裏面內容寫入
i \string 在匹配到的行上門新建一行 並寫入
r file 將file文件中的內容讀取到匹配的行後面
w file 將匹配到的行內容寫入文件file中
s /pattern/string/
s /// 這種表現形式外 還可以是@@@或者### 這中表現形式
\(\) \1 \2 也可以用到 反向引用,當引用是全局的時候 也可以直接用&來引用
2.4 修飾符
-g 全局匹配 表示每一行中所有符合條件的都替換
-i 忽略字符的大小寫
練習部分:
1刪除 /etc/grup.conf 中行首的空白符
sed s/^[[:space:]]// /etc/grub.conf
sed '1,$s/^[[:space:]]//' /etc/grub.conf 此處注意s後面沒有空格直接接的/
2替換/etc/inittab 中“id=3” 中的數字爲5
sed 's/id:3/id:5/' /etc/inittab
sed '$s/id:3/id:5/' /etc/inittab
sed '$s/^id:3/id:5/' /etc/inittab
3刪除/etc/inittab 中的空白行
sed '/^#$/d' /etc/inittab
4刪除/etc/inittab文件中開頭的#號
sed 's/^#//' /etc/inittab
5取出一個文件路徑中的目錄名稱
echo "/etc/rc.d/" | sed -r 's@^(/.*/)[^/]+/?@\1@g'
對上述問題進行分解處理
1 /etc/rc.d/ 搜索^/.*/ 的字符時默認的貪婪模式會搜索到整個字符串/etc/rc.d/
2 /etc/rc.d/ 搜索[^/]+ 默認搜索時的貪婪模式 會匹配一個單詞(此處的單詞是以字母和數字組成的字符集)etc ;此時若不加“+” 匹配到的是一個字符,[]表示匹配單個字符 [^/] 表示除/之外的單個字符。 [^/]+ 接^/.*/ 之後就表示rc.d 這個單詞
當第一部分的貪婪模式和第二部分的都匹配到相同的字符時,第二部分的匹配內容是從後面的單詞開始向前面的單詞的方向進行匹配的,在反向引用時其就縮小匹配範圍 此時緊緊只是匹配了/etc// 這個部分
3/? 在次與^/.*/匹配的範圍重合 根據最小範圍匹配原則,則最後反向引用匹配的結果爲
/etc/
7統計/etc/init.d/functions文件中每個單詞出現的次數並排序
sed -r 's/[^[:alpha:]]+/\n/g' /etc/init.d/functions | sort | uniq -c