Sed Stream Editor
行編輯器(全屏編輯器:vi)
逐行讀取到模式空間,處理完之後輸出 預設不修改源檔案,
僅對模式空間中的資料做處理,處理完之後将模式空間的内容追行列印
sed 'Address Command' file... ‘’ “” 都可以,如果有變量用弱引用
Address
1、StartLine,EndLine
1,100
$ 最後一行
$-1 倒數第二行
2、/RegExp/
/^root/ '/oot/d'
3、/pattern1/,/pattern2/
第一次被pattern1比對到的行開始,至第一次被pattern2比對到的行結束
4、LineNumber
指定的行
5、StartLine, +N
從startLine開始,向後的N行
Command
-i 直接修改源檔案
-n 靜默模式,不再顯示模式空間中内容
-e SCRIPT -e SCRIPT 可以同時執行多個腳本(COMMAND)
sed --e '1,10d' -e 's/L\(..e\)r/l\1/g' /shell/1
-f 用腳本處理/PATH/TO/SED_SCRIPT
vi /shell/script
2a\two numbers
4s/#/@/g
$i\end numbers
sed -f /shell/script /shell/1
-r 适用擴充正規表達式
錯誤的寫法 history | sed -r 's/^[[:space:]]\(.*\)/\1/'
d 删除行
sed '1d' 删除第一行
sed '3,$d' /tmp/inittab 删除第三行到最後一行
sed '1,+2d' /tmp/inittab 删除第一行到第三行
sed '/^\//d' /etc/fstab 删除以\開頭的行
p 顯示比對到的行
sed '/^\//p' /etc/fstab 比對到的顯示2次,因為sed預設會顯示模式空間的行
sed -n '/^\//p' /etc/fstab
a \string 在比對到的行後面,追加新行,内容為"string" a後面加\利于實作特殊字元
sed '/^\//a\# hello world \n#hello linux' /etc/fstab 在\開頭行後加2行注釋
sed '/^\//a#hello\n#hello' /etc/fstab a
i \string 在比對到的行前面,追加新行,内容為"string"
r file 将制定檔案内容添加至符合條件的行後
sed '2r /etc/inittab' /shell/1
sed '1,2r /etc/inittab' /shell/1 第一行後面添加一遍,第二行後面添加一遍
w 将指定範圍内的内容另存至指定的檔案中,如果是已存在檔案會覆寫其内容,如果不存在會建立檔案并儲存内容
sed -n '/^#/w /shell/2' /etc/inittab
s /pattern/string/ 查的并替換 預設開始隻替換每行的第一個
sed '1,3s/#/$/' /shell/1
sed 's/^\//#/' 2 替換以/開頭的行為#
sed '1s/#/$/;3s/#/$/' /shell/1 替換第一行第三行第一個比對到的
修飾符
g 全部替換
sed '1s/#/$/g;3s/#/$/' /shell/1 替換第一行全部和第二行第一個比對到的
i 比對時忽略大小寫
sed 's/inittab/haha/ig' /shell/1 替換全文inittab時忽略大小寫,替換為haha
s /正規表達式/字元串( 支援引用,不支援正則)/ s$$$ s@@@ s%%% 這樣不适用查找中帶有的,平時适用/,這樣查找/是就不用轉義了
後向引用 \(\) \1 \2
l..e like --> liker love -->lover 兩種實作 \(\) &
sed 's/\(l..e\)/\1r/' /shell/1
& 引用模式比對整個串
sed 's/l..e/&r/' /shell/1
隻引用一部分的時候,後項引用可以細化第一個pattern,&則是全部比對,
實作like --> Liker love -->Lover
sed 's/l\(..e\)/L\1r/g' /shell/1
現實删除history前面的空白字元
history | sed -r 's/^[[:space:]]*//g'
練習
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<code>1、删除</code><code>/etc/grub</code><code>.conf檔案中行首的空白字元</code>
<code> </code><code>sed</code> <code>'s/^[[:space:]]*//'</code> <code>/etc/grub</code><code>.conf</code>
<code>2、替換</code><code>/etc/inittab</code><code>檔案中“</code><code>id</code><code>:5:initdefault:"一行中的數字為3;</code>
<code> </code><code>sed</code> <code>'s/^\(id\):5:\(initdefault\)/\1:3:\2/'</code> <code>/etc/inittab</code>
<code>3、删除</code><code>/etc/inittab</code><code>檔案中的空白行</code>
<code> </code><code>sed</code> <code>'/^$/d'</code> <code>/etc/inittab</code>
<code>4、删除</code><code>/etc/inittab</code><code>檔案中開頭的</code><code>#号,但要求#号後面必須有空白字元</code>
<code> </code><code>sed</code> <code>'s/^#\([[:space:]]\+\)/\1/'</code> <code>/shell/inittab</code>
<code>5、删除</code><code>/etc/inittab</code><code>檔案中開頭的</code><code>#号和空白字元,但要求#号後面必須有空白字元</code>
<code> </code><code>ed -r </code><code>'s/^#[[:space:]]+//'</code> <code>/shell/inittab</code>
<code> </code><code>sed</code> <code>'s/^#\([[:space:]]\+\)//'</code> <code>/shell/inittab</code>
<code>6、取出一個檔案路徑的目錄名稱</code>
<code> </code><code>echo</code> <code>"/shell/asdasd/inittab"</code> <code>| </code><code>sed</code> <code>'s/^\(.*\)\/.*$/\1/'</code>
<code> </code><code>echo</code> <code>"/shell/haha/inittab"</code> <code>| </code><code>sed</code> <code>'s#^\(/.*\)/.*#\1#'</code>
<code> </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^(/.*/)[^/]+/?#\1#'</code>
<code>7、取得路徑基名</code>
<code> </code><code>echo</code> <code>"/shell/haha/inittab/"</code> <code>| </code><code>sed</code> <code>-r </code><code>'s#^/.*/([^/]+)/?#\1#'</code>
<code>8、删除某檔案中以空白字元後面跟</code><code>#類的行中的開頭的空白字元及其#</code>
<code> </code><code>sed</code> <code>'s/^[[:space:]]#\(.*\)/\1/'</code> <code>/shell/inittab</code>
本文轉自 ftmoonfans 51CTO部落格,原文連結:http://blog.51cto.com/soulboy/1259038