Shell腳本之sed流編輯器語法(一)

sed流編輯器 (stream deiter),以行爲單位的文本處理程序 語法: sed    [options]    'command'    testfile options部分     -n    關閉模式空間輸出     -p    打印指定行     -e    支持多處理命令     -i    將修改寫入原文件     -r    支持正則表達         -f    導入command腳本 command 部分     '[地址1,地址2] [函數] [參數(標記)]'      地址定位方法  1數字  2正則 數字 十進制 1            單行 1,3         從第一到第三行 2,+4      第二行,及以後的4行 4,~3     從第4行開始,到下一個3的倍數行 2~3      從第2行起,沒間隔3行的行 $           最後一行 1!          除了第1行之外的行 使用示例: [root@teacher ~]# cat -n /etc/passwd | sed -n '2,+4p'      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 ------------------------------------------------------------------- 正則——正則必須用  / /  包裹起來              擴展正則須要使用     -r    參數或轉義 經常使用正則表達: ^            行首            $            行尾 .            除了換行之外任意單個字符 .*            全部字符 []            字符組內任一字符 [^]            對字符組內的每一個字符取反(不匹配字符組內的每一個字符) ^[^]        非字符組內的字符開頭的行 [a-Z]        全部大小寫字母 [0-9]        數字 \<            單詞頭,單詞通常以空格或特殊字符作分隔,連續的字符串被當作單詞 \>            單詞尾 擴展正則  ——使用  -r 參數 或  轉義 如: sed    -n    '/roo\?/p'    /etc/passwd sed    -rn     '/roo?/p'     /etc/passwd ?                    零個或一個前導字符 +                   一個或多個前導字符 abc|def          字符串abc或def a(bc|de)f        字符串abcf或adef x{m}             字符x出現m次 x{m,}            字符x出現m次以上 x{m,n}          字符出現m次到n次之間 使用示例: [root@teacher ~]# sed  -n   '/^root/p'   /etc/passwd root:x:0:0:root:/root:/bin/bash [root@teacher ~]# cat /etc/hosts | sed  -n  '/^[1234567890]/p' 127.0.0.1       localhost.localdomain localhost 192.168.100.254         teacher.aixocm.com teacher [root@teacher ~]# cat /etc/passwd | sed -rn '/ro?t/p' vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin rpc:x:32:32:Portmapper RPC user:/:/sbin/nologin [root@teacher ~]# cat /etc/passwd | sed -rn '/roo?t/p' root:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root:/sbin/nologin --------------------------------------------------------------- 函數     a    後插    c    替換    i    前插    d    刪除    w    另存爲        p    打印 使用示例: [root@localhost test]# sed  '/localhost4/a  myserver10.10 ftp' /etc/hosts 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 myserver10.10 ftp ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost test]# sed  '/localhost4/c  myserver10.10 ftp' /etc/hosts myserver10.10 ftp ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost test]# sed  -n '/localhost4/w  /tmp/haoren.txt' /etc/hosts [root@localhost test]# cat  /tmp/haoren.txt 127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 注意:千萬不要   >源文件,否則數據所有丟失     要保存結構能夠使用    -i 參數,或 >新文件 ------------------------------------------------------------------------ 替換—— s 字符串替換 語法:‘s/old/new/g’                最後的字母g表示所有替換         ‘s/old/new/3’                 最後的數字3表示替換第三個匹配的字符串 使用示例: [root@localhost test]# sed -n 's/root/WUWEI/p' /etc/passwd WUWEI:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/WUWEI:/sbin/nologin [root@localhost test]# sed -n 's/root/WUWEI/gp' /etc/passwd WUWEI:x:0:0:WUWEI:/WUWEI:/bin/bash operator:x:11:0:operator:/WUWEI:/sbin/nologin [root@localhost test]# sed -n 's/root/WUWEI/2p' /etc/passwd root:x:0:0:WUWEI:/root:/bin/bash root@localhost test]# sed -n '1,$s/root/WUWEI/p' /etc/passwd WUWEI:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/WUWEI:/sbin/nologin ------------------------------------------------------ \( \)   或   -r  ( ) 保存被匹配的字符,以備反向引用\N時使用,最多9個標籤 &    替換時使用,不定義標籤時使用(反向引用) 使用示例: [root@localhost test]# sed  -n 's/\(root\)/\1_WUWEI/p' /etc/passwd root_WUWEI:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root_WUWEI:/sbin/nologin [root@localhost test]# sed  -rn  's/(root)/\1_WUWEI/p'  /etc/passwd root_WUWEI:x:0:0:root:/root:/bin/bash operator:x:11:0:operator:/root_WUWEI:/sbin/nologin [root@localhost test]# sed -rn  '1,$s/(wuwei)(.*)(home)(.*)(bash)/\5\2\1\4\3/p'  /etc/passwd bash:x:500:500::/wuwei/wuwei:/bin/home [root@localhost test]# sed -n  's/root/&_WUWEI/2p'  /etc/passwd root:x:0:0:root_WUWEI:/root:/bin/bash ------------------------------------------------------- 字符一一對應替換——    y 不支持使用 -n    p關閉顯示空間,在打印 [root@localhost test]# sed  'y/01234567/ABCDEFFG/' /etc/hosts BCG.A.A.B   localhost localhost.localdomain localhostE localhostE.localdomainE ::B         localhost localhost.localdomain localhostF localhostF.localdomainF ------------------------------------------------------- 支持多個正則表達——   -e 使用示例: [root@localhost test]# sed  -e 's/localhost/LINUXSEVER/g'   -e 's/127/FFFFF/'   /etc/hosts FFFFF.0.0.1   LINUXSEVER LINUXSEVER.localdomain LINUXSEVER4 LINUXSEVER4.localdomain4 ::1         LINUXSEVER LINUXSEVER.localdomain LINUXSEVER6 LINUXSEVER6.localdomain6 ------------------------------------------------------------ 命令組合——  {}  多個命令使用分號: 隔開,至關於  -e  參數 使用示例: [root@localhost test]# cat  /etc/hosts 127.0.0.1   localhost localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost test]# sed  '{=;s/SXKEJILINUX/localhost4/g;s/localhost/SERVER/g;}'  /etc/hosts 1 127.0.0.1   SERVER SERVER.localdomain SERVER4 SERVER4.localdomain4 2 ::1         SERVER SERVER.localdomain SERVER6 SERVER6.localdomain6 [root@localhost test]# sed  {=;s/SXKEJILINUX/localhost4/g;2!s/localhost/SERVER/g;} ' /etc/hosts 1 127.0.0.1   SERVER SERVER.localdomain SERVER4 SERVER4.localdomain4 2 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 等號 「=」 打印行號 感嘆號 「 ! 」 表示取反,2!s/old/new/  表示除了第2行之外的都進行替換 -------- [root@localhost test]# sed  -n  '1{=;s/localhost/LINUX/;s/127/99999/p}' /etc/hosts   //指定對第一行進行一系列處理 1 99999.0.0.1   LINUX localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4 [root@localhost test]# sed  -n  '/127/{=;s/localhost/LINUX/;s/127/99999/p}'  /etc/hosts    //正則表達式匹配的行進行處理 1 99999.0.0.1   LINUX localhost.localdomain SXKEJILINUX SXKEJILINUX.localdomain4 -------------------------------------------------------------- 將修改直接寫入文件    ——  -i 使用示例: [root@localhost test]# ls -i /etc/hosts 1311471  /etc/hosts [root@localhost test]# sed  -i 's/localhost4/SXKEJILINUX/' /etc/hosts [root@localhost test]# cat /etc/hosts 127.0.0.1   localhost localhost.localdomain SXKEJILINUX localhost4.localdomain4 ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6 [root@localhost test]# ls -i /etc/hosts 1319270  /etc/hosts 注意:使用-i參數後,至關於生成了新的/etc/hosts文件,inode信息發生了變化 ---------------------------------------------------------------- 腳本方法——   -f   能夠將要作的處理寫入腳本,而後在命令行引用該腳本便可。 語法:   -f   參數   引用腳本(腳本末尾不能有空格或其它製表符) 使用示例: [root@localhost test]# cat sxkj.txt 111111111111111 222222222222222 333333333333333 444444444444444 555555555555555 666666666666666 777777777777777 888888888888888 [root@localhost test]# cat rec.sed       //腳本內容 2,4d s/5555*/AAAAAAAAAAAA/ s/777*/BBBBBBBBBBBB/ [root@localhost test]# sed  -f  rec.sed sxkj.txt 111111111111111 AAAAAAAAAAAA 666666666666666 BBBBBBBBBBBB 888888888888888  
相關文章
相關標籤/搜索