sed命令詳解及實例

    要想靈活的並按照需要處理文本,我們需要充分的學會並掌握三大文本處理工具,grep、sed(數據流編輯器)、awk(報告文本的生成器)

    下面介紹並學習sed命令的基本用法

    sed又名stream editer,是行編輯器(編輯器包括字處理器和文本編輯器),是文本編輯器,是操作純Ascii碼文本的,操作文本是按行進行操作的,逐行處理文本,默認並不直接處理文本本身,操作時是將文本逐行讀取到內存中,在內存中處理後並將符合模式匹配到的行顯示到屏幕上,內存空間稱爲sed模式空間。 默認是打印模式空間。   

SYNOPSIS

       sed [OPTION]... {script-only-if-no-other-script} [input-file]...

       sed [OPTION]... 'AddressCommand' file....地址加命令

           $:表示文本中的最後一行

         Option:

            -n:表示靜默模式,不顯示模式空間中的內容,只與命令相關

            -i:直接修改原文件

            -e script -e script:可以同進執行多個腳本

            -f /path/to/sed_script: 表示讀取文件中的腳本對文本進行處理

                sed -f /script file..

            -r:表示使用擴展正則表達式

         Address:

            1、startline,endline,如1,10指從第一行到第10行;

            2、/pattern(regexp正則表達式)/,如/^root/找出以root開頭的行

            3、/pattern1/,/pattern2/,表示第一次被模式1匹配到的行和第一次被模式2匹配到的行中間所有的行。

            4、linenumber表示批定的行或特定的行

            5、startline,+N,表示從startline開始後的N行,總共是N+1行;

        Command:

            d:表示刪除符合條件的行;

                如:刪除/etc/fstab文件中的前四行,如第一行到倒數第二行,則爲1,$-1

                [root@station01 ~]# sed "1,4d" /etc/fstab

                如:刪除包含sys的行               

                [root@station01 ~]# sed "/sys/d" /etc/fstab

                如:刪除第一行開始向後十行的內容               

                [root@station01 ~]# sed "1,+10d" /etc/fstab

                如:只刪除第五行則               

                [root@station01 ~]# sed "5d" /etc/fstab

            p:表示顯示符合條件的行,默認顯示模式空間中的一次和命令匹配到的一次,共二次

                如:顯示文件中以/開頭的行,並只顯示符合條件的行               

                [root@station01 ~]# sed -n "/^\//p" /etc/fstab

            a \sting:在批定或匹配到的行後面新增一行,內容爲string

                如:在/開頭的行後新增一行,內容爲“# It is a blank line.”               

                [root@station01 ~]# sed '/^\//a \# It is a blank line.' /etc/fstab

                 如:在/開頭的行後新增兩行,內容爲“# It is first blank line.”“# It is second  blank line.”

                 [root@station01 ~]# sed '/^\//a \# It is first blank line.\n# It is second  blank line' /etc/fstab

            i \sting:在批定或匹配到的行前面新增一行,內容爲string

            r filename:表示在指定的行後將指定的文件內容添加進來,用於合併文件內容

            如:將/etc/issue文件的內容添加到/etc/fstab文件的第二行後               

                [root@station01 ~]# sed '2r /etc/issue' /etc/fstab

            如:將/etc/issue文件的內容添加到/etc/fstab文件的第一行和第二行後               

                [root@station01 ~]# sed '1,2r /etc/issue' /etc/fstab

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

                如:將包含oot中的文件內容保存到/tmp/oot.tmp文體中,可以使用-n選項

                [root@station01 ~]# sed '/oot/w /tmp/oot.tmp' /etc/fstab

            s/pattern(可以用正則表達式的元字符)/string/修飾符:表示查找匹配到的pattern字符串並替換爲string,默認是每一行中第一次被模式匹配到的字符串,如需要替換行中被模式匹配到的所有字符串,則需要加修飾符;其中的/可以換成其它的字符,確保一致即可,並且不需要轉義,如###,@@@,%%%等

                    g:全局替換修飾符

                    i:查找時忽略大小寫

                如:將/etc/fstab中包含小寫oot的字符串替換爲大寫的OOT               

                   [root@station01 ~]# sed 's/oot/OOT/' /etc/fstab

                如:將/etc/fstab中以/開頭的行中的/替換爲#               

                   [root@station01 ~]# sed 's/^\//#/' /etc/fstab

                如:將/etc/fstab中的所有/替換爲#               

                   [root@station01 ~]# sed 's/\//#/g' /etc/fstab

            後向引用:

                \(\):\1,\2 等

                &:表示模式匹配到的整個串

                如找出以l開頭e結尾中間是任意兩個字符,替換爲在其後加r

                    文件內容如下:

                    [root@station01 ~]# cat sed.txt 
                     he like.
                     her love.

                    #1)執行結果如下:

                    [root@station01 ~]# sed 's%l..e%&r%' sed.txt 
                    he liker.
                    her lover.
                    #2)                    
                    [root@station01 ~]# sed 's%\(l..e\)%\1r%' sed.txt     
                    he liker.
                    her lover.

                若要匹配查找字符串中的一部分時,只能使用後向引用,而不能用&

                    如將l..e,like-->Like,love-->Love時,只能用後向引用  

                    執行結果如下:                  

                    [root@station01 ~]# sed 's%l\(..e\)%L\1%' sed.txt       
                    he Like.
                    her Love.

                如將history命令中的執行結果行首空白刪除,並取出行號

                [root@station01 ~]# history | sed -r 's#^[[:space:]]+##g' |cut -d' ' -f1

練習題:

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

        [root@station01 ~]# sed  -r 's#^[[:space:]]+##g' /etc/grub.conf

    2、替換/etc/inittab文件中行中id:3:initdefault:字符串中的3改爲6        

        [root@station01 ~]# sed 's#\(id:\)[0-9]\(:initdefault:\)#\16\2#g' /etc/inittab

    3、刪除/etc/inittab文件中的空白行

        [root@station01 ~]# sed '/^$/d' /etc/inittab

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

        [root@station01 ~]# sed 's/^#//g' /etc/inittab

    5、刪除某文件中行首的#及其後面的空白字符

        文件內容如下

        [root@station01 ~]# cat b.txt 
        #    It is a blank.
             #It is second blank.

        執行結果:

        [root@station01 ~]# sed -r 's%^#[[:space:]]+%%g' b.txt 
        It is a blank.
             #It is second blank.

    6、刪除某文件中行首的空白字符及其後的#

        文件內容如5中的文件

        [root@station01 ~]# sed -r 's%^[[:space:]]+#%%g' b.txt  
        #    It is a blank.
        It is second blank.

    7、取出某路徑的父目錄

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章