文本行編輯器-----sed解密

sed命令正則表達式

文本處理三劍客:express

grep, egrep, fgrep:文本過濾器bash

sed:Stream EDitor,流編輯器,行編輯器

awk:文本格式化工具,報告生成器ide


sed須要理解模式空間和holdspace,下面看看這個圖就明白了工具


wKioL1b_uTDhVVCjAAu70GoJoW8953.bmp


     sed [OPTION]...  'script'  [input-file] ...spa


           經常使用選項:-n:不輸出模式空間中的內容至屏幕;regexp

-e script, --expression=script:多點編輯;orm

                         -f  /PATH/TO/SED_SCRIPT_FILE  每行一個編輯命令;blog

      -r, --regexp-extended:支持使用擴展正則表達式;

         -i[SUFFIX], --in-place[=SUFFIX]:直接編輯原文件 ;

舉例:~]# sed  -e  's@^#[[:space:]]*@@'   -e  '/^UUID/d'  /etc/fstab




        地址定界script:地址定界編輯命令

               (1) 空地址:對全文進行處理;

               (2) 單地址:

                      #:指定行;

                     /pattern/:被此模式所匹配到的每一行;

               (3) 地址範圍

                      #,#:

                      #,+#:

                       #,/pat1/

                         /pat1/,/pat2/

                        $:最後一行;

            (4) 步進:~

                    1~2:全部奇數行

                    2~2:全部偶數行



        編輯命令:

                    d:刪除;

                    p:顯示模式空間中的內容;

                    a  \text:在行後面追加文本「text」,支持使用\n實現多行追加; 

                    i  \text:在行前面插入文本「text」,支持使用\n實現多行插入; 

                    c  \text:把匹配到的行替換爲此處指定的文本「text」;

                    w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;

      r  /PATH/FROM/SOMEFILE:讀取指定文件的內容至當前文件被模式匹配到的行後面;文件合併;

                    =:爲模式匹配到的行打印行號;

                    !:條件取反;




                    s///:查找替換,其分隔符可自行指定,經常使用的有s@@@, s###等;

                        替換標記:@ # /

                        g:全局替換;

                        w /PATH/TO/SOMEFILE:將替換成功的結果保存至指定文件中;

                        p:顯示替換成功的行;





高級編輯命令:
        h:把模式空間中的內容覆蓋至保持空間中;
        H:把模式空間中的內容追加至保持空間中;
        g:把保持空間中的內容覆蓋至模式空間中;
        G:把保持空間中的內容追加至模式空間中;
        x:把模式空間中的內容與保持空間中的內容互換;
        n:覆蓋讀取匹配到的行的下一行至模式空間中;
        N:追加讀取匹配到的行的下一行至模式空間中;
        d:刪除模式空間中的行;
        D:刪除多行模式空間中的全部行;



示例:

sed  -n  'n;p'  FILE:顯示偶數行;

sed  '1!G;h;$!d'  FILE:逆序顯示文件的內容;

sed  ’$!d'  FILE:取出最後一行;

sed  '$!N;$!D' FILE:取出文件後兩行;

sed '/^$/d;G' FILE:刪除原有的全部空白行,然後爲全部的非空                                         白行後添加一個空白行;

sed  'n;d'  FILE:顯示奇數行;

sed 'G' FILE:在原有的每行後方添加一個空白行;




&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&


拓展

練習1:刪除/boot/grub/grub2.cfg文件中全部以空白字符開頭的行的行首的全部空白字符;

~]# sed  's@^[[:space:]]\+@@' /etc/grub2.cfg

練習2:刪除/etc/fstab文件中全部以#開頭的行的行首的#號及#後面的全部空白字符;

~]# sed  's@^#[[:space:]]*@@'  /etc/fstab

練習3:輸出一個絕對路徑給sed命令,取出其目錄,其行爲相似於dirname;

~]# echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'

~]# echo "/var/log/messages" | sed -r 's@[^/]+/?$@@'

sed練習

 1:刪除/etc/grub.conf文件中行首的空白符;

   sed -r ‘s@^[[:space:]]+@@g' /etc/grub.conf

 2:替換/etc/inittab文件中「id:3:initdaefault:」一行中的數字爲5

   sed 's@\(id:\)[0-9]\(:initdefault:\)@\15\2@g' /etc/inittab

 3:刪除/etc/inittab文件中的空白行字符

   sed '/^$/d' /etc/inittab 

   sed -r 's@^#[[:space:]]+@@g' /etc/inittab

 4:刪除/etc/inittab文件中開頭的#號

   sed 's@^#@@g' /etc/inittab

 5:刪除某文件中開頭的#號及後面的空白字符,但要求#號後面必須有空白字符

   sed -r 's@^#[[:space:]]+@@g' /etc/inittab

 6:刪除某文件中以空白字符後面跟#類的行中的開頭的空白字符及#;

   sed -r 's@^[[:space:]]+#@@g /etc/inittab'

 7:取出一個文件路徑的目錄名稱

   echo "/etc/rc.d" | sed -r 's@^(/.*/)[^/]+/?@\1@g' 

 8:取出一個文件路徑的文件名稱

   echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'

 9:遞歸替換

    sed -i 's/abc/bcd/g' `grep "abc" -rl /usr/local/src/zhangys/`


如下是r 遞歸目錄   l 輸出文件名 grep找到文件中是abc的字符串送給sed好替換


sed 基本用法

行編輯器(全屏編輯器:vi、)


模式空間:默認不編輯源文件,僅對末世空間中的數據作處理;然後,處理結束後,將模式空間打印至屏幕 。

  

p:顯示符合條件的行

例:sed‘/^\//d’ /etc/fstab刪除以斜線開頭的行

   sed -n '/^\//p' /etc/fstab 顯示以斜槓開頭的行


r FILE:用於合併文件

sed ‘2r /etc/issue’ /etc/fstab 

將文件issue裏的內容粘貼到fstab的第二行

w FILE:將指定範圍內的內容另存至指定的文件中

例:sed -n‘/oot/w /tmp/oot.txt' /etc/fstab

-n的做用 禁止打印模式空間的內容


s/pattern模式/string字符串/:查找並替換

  g:全局替換 

  i:忽略字符大小寫

例:sed‘s/oot/OOT/’/etc/fstab

例:sed ‘s/^\//#/' /etc/fstab將行首斜線替換成井號

例:sed 's/\//#/' /etc/fstab替換每一行第一次被模式匹配到的串

例:sed 's/\//#/g' /etc/fstab 全局替換成沒有

                                i:查找時忽略大小寫

例:sed 's#\(l..e\)#\1r#e' sed.txt將全部l開頭e結尾的字符創後面加上r



  例:sed ‘s#\(l..e\)#\1r#g’ sed.txt   在like love 後面加r

    等同於 sed ‘s#l..e#&r#g’ sed.txt

   



練習:

1取出一個文件路徑的父目錄名稱  如/etc

echo "/etc/rc.d" | sed -r 's@^(/.*/)[^/]+/?@\1@g'

保留其子目錄名

echo "/etc/rc.d" | sed -r 's@^/.*/([^/]+)/?@\1@g'


2刪除/etc/greb.conf文件中行首的空白符

sed '/^$/d' /etc/inittab

相關文章
相關標籤/搜索