shell---sed學習

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


  1. sed可以從stdin中讀取內容

    $ cat filename | sed 's/pattern/replace_string/'

  2. 選項 -i 會使得sed用修改後的數據替換原文件

    $ sed -i 's/pattern/replace_string/' filename

  3. g標記可以使sed執行全局替換

    $ sed 's/pattern/replace_string/g' filename
    $ sed 's/pattern/replace_string/gi' filename //忽略大小寫替換 
    
  4. g標記可以使sed匹配第N次以後的字符被替換

    $ echo "thisthisthisthis" | sed 's/this/THIS/2g'

  5. sed中的分隔符可以替換成別的字符, 因爲s標識會認爲後面的字符爲分隔符

    $ sed 's:text:replace_text:'
    $ sed 's|text|replace_text|'
    
  6. sed可以利用指令來刪除文件中的空行

    $ sed '/^$/d' filename

  7. 由於在使用 -i 參數時比較危險, 所以我們在使用i參數時在後面加上.bak就會產生一個備份的文件,以防後悔

    sed -i.bak 's/pattern/replace_string/' filename

  8. sed如果在腳本中使用的話, 不可避免的要調用變量, 所以以下這種方式可以用來調用變量即’ '換成了" "

    $ text=hello
    $ echo "hello world" | sed "s/$text/HELLO/"
    
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章