shell 編程-SED
非交互式編輯器,一次處理一行內容。
示例文件
file1.txt
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post Road, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA
用Massachusetts替換MA:
#sed 's/MA/Massachusetts/' file1.txt
使用多重指令:
# sed 's/MA/Massachusetts/ ; s/PA/Pennsylvania/' file1.txt
使用腳本文件:
腳本:namestate
s/MA/Massachusetts/
s/PA/Pennsylvania/
s/CA/California/
s/VA/Virginia/
s/OK/Oklahoma/
-f<script文件>或--file=<script文件> 以選項中指定的script文件來處理輸入的文本文件。
$ sed -f namestate file1.txt
保存輸出:
$ sed -f namestate file1.txt > newfile.txt
阻止輸入行自動顯示:
$ sed -n 's/MA/Massachusetts/p' file1.txt
sed流編輯器用法及解析
sed: stream editor(流編輯器)的縮寫. 它們最常見的用法是進行文本的替換.
[root@newrain ~]# sed '1d' passwd //刪除文件的第1行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# sed '1,2d' passwd //刪除文件的第1,2行 daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# cat e.txt
/etc/abc/456
etc
[root@newrain ~]# sed -r 's#/etc/abc#/var/lib#' e.txt
/var/lib/456
etc
[root@newrain ~]# cat passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# sed '2,$d' passwd //刪除第2行到最後一行s
root:x:0:0:root:/root:/bin/bash
[root@newrain ~]# sed '/root/d' passwd //匹配到root,刪除此行
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# sed '/root/,2d' passwd //匹配到root行,到此行的第2行
daemon:x:2:2:daemon:/sbin:/sbin/nologin
[root@newrain ~]# cat -n passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/sbin/nologin
3 daemon:x:2:2:daemon:/sbin:/sbin/nologin
4 adm:x:3:4:adm:/var/adm:/sbin/nologin
5 lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6 sync:x:5:0:sync:/sbin:/bin/sync
7 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
8 halt:x:7:0:halt:/sbin:/sbin/halt
9 mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10 operator:x:11:0:operator:/root:/sbin/nologin
[root@newrain ~]# sed '1~2d' passwd //刪除奇數行
bin:x:1:1:bin:/bin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
halt:x:7:0:halt:/sbin:/sbin/halt
operator:x:11:0:operator:/root:/sbin/nologin
[root@newrain ~]# sed '0~2d' passwd //刪除偶數行
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
-
sed可以從stdin中讀取內容
$ cat filename | sed 's/pattern/replace_string/'
-
選項 -i 會使得sed用修改後的數據替換原文件
$ sed -i 's/pattern/replace_string/' filename
-
g標記可以使sed執行全局替換
$ sed 's/pattern/replace_string/g' filename $ sed 's/pattern/replace_string/gi' filename //忽略大小寫替換
-
g標記可以使sed匹配第N次以後的字符被替換
$ echo "thisthisthisthis" | sed 's/this/THIS/2g'
-
sed中的分隔符可以替換成別的字符, 因爲s標識會認爲後面的字符爲分隔符
$ sed 's:text:replace_text:' $ sed 's|text|replace_text|'
-
sed可以利用指令來刪除文件中的空行
$ sed '/^$/d' filename
-
由於在使用 -i 參數時比較危險, 所以我們在使用i參數時在後面加上.bak就會產生一個備份的文件,以防後悔
sed -i.bak 's/pattern/replace_string/' filename
-
sed如果在腳本中使用的話, 不可避免的要調用變量, 所以以下這種方式可以用來調用變量即’ '換成了" "
$ text=hello $ echo "hello world" | sed "s/$text/HELLO/"