天天看點

sed指令簡介

<code>文本處理三劍客:</code>

<code>    </code><code>grep:egeep,fgrep:文本過濾器</code>

<code>    </code><code>sed:stream Editor:流編輯器,逐行</code>

<code>    </code><code>awk:文本格式化工具,報告生成器</code>

一、sed簡介

    sed一次從檔案中讀取一行,不會修改原檔案的内容

    sed指令将目前處理的行讀入模式空間(pattern space)進行處理,sed在該行上執行完所有指令後就将處理好的行列印到螢幕上(除非之前的指令删除了該行)

    sed處理完一行就将其從模式空間中删除,然後将下一行讀入模式空間,進行處理、顯示。

    處理完檔案的最後一行,sed便結束運作。sed在臨時緩沖區(模式空間)對檔案進行處理,是以不會修改原檔案,除非顯示指明-i選項。

        放在sed的工作空間:pattern space 處理--&gt;模式比對--&gt;比對(則編輯-&gt;根據編輯指令是否輸出) //不比對(stout)

        輸出到--&gt;stout

    可以基于正規表達式進行文本過濾

        把檔案的

    檔案行資料流:---&gt;|pattern space|  //預設顯示沒有比對到的行

                            v

                          /      \

                        No        Yes

                        |        /  \

                        |     /    edit

                        |   /        |

                        V/            Hold space 

                        stdout        

        //sed空間:空間可以轉換

            pattern space 

            hold space //處理的結果

    sed [option] ... 'script' [input-file]...  //輸入檔案可以有多個

        script:位址定界+編輯指令

        OPtions:

            -n ,--quiet,--slient不輸出模式空間的内容到螢幕

                suppress:壓制,不讓

            -e script, --expression=script //預設隻有一個script,實作多點編輯

            -f script-file //腳本檔案,每行一個編輯指令

            -r 支援擴充的正規表達式

            -i 直接編輯原檔案

        位址定界:

            1.空位址,表示對全文進行處理

            2.單位址,

                # :指定行

                /pattern/ :被此模式比對到的每一行

            3.位址範圍

                #,# //起始位址

                #,+# //向後幾行

                #,/pattern/  //到pattern模式比對結束

                /pat1/,/pat2/   //斜線是預設的,必須有

            4.步進:~

                1~2 //所有的奇數行

                2~2 //所有的偶數行

        編輯指令:

            d 删除模式空間的内容

                sed '/^UUID/d' /etc/fstab //删除uuid開頭的行

                sed '3d' /etc/fstab //删除第3行

                sed '1~2d' /etc/fstab  //顯示偶數行,删除奇數行

            p 列印模式空間的内容

                sed '1~2p' /etc/fstab //模式空間顯示兩遍,

                        //偶數行沒有被比對,是以顯示

                        //奇數行被比對到,預設為顯示

                        //edit後的操作是顯示

                sed '1~2p' /etc/fstab -n //隻顯示奇數行,模式空間的内容

            a\test 追加 :在模式比對到的行,下一行追加文本,支援使用,\n實作多行追加

                後面追加

            i\test:在行前面插入文本,支援使用\n實作多行插入

                sed '3i \new line' fstab.t //不比對到的行,預設也為輸出

                sed '3a \new line\nanother line' fstab.t //插入兩行

                sed '/UUID/a \# add new device base on UUID' fstab.t //在每一行的UUID前面都加了資訊

            c\text:把比對到的行替換為此處指定的文本"text";

            主要: "/" 和 "\" 都可以使用

            w /PATH/TO/SOMEWHERE :儲存模式空間比對到的行至指定的檔案中

                sed -n '/^[^#]/w /tmp/fsatb.test' fstab //把非#開頭的行,儲存到檔案

            r /PATH/TO/SOMEFILE :讀取指定檔案的内容到目前檔案被模式比對到的行中

                sed '3r /etc/issue' fstab //在3行,讀入issue的内容

                sed '/dev/r /etc/issue' fstab //比對到的行,都讀入issue檔案内容

            = 為模式空間比對到的行,列印行号

                sed '/dev/=' fstab

            ! 條件取反

                sed '/^#/!d' /etc/fstab //模式取反

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

                替換标記:

                    g:全局替換

                    w /PATH/TO/SOMEFILE:儲存到指定檔案

                    p:顯示替換成功的行

二、練習

    1.删除/boot/grub/grub2.cfg檔案中所有以空白開頭的行的行首的所有空白字元

    2.删除/etc/fstab檔案中所有以#開頭的行的行首的#号以及#号後面的空白字元

    3.輸出一個絕對路徑,取出其目錄,其行為類似于dirname

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

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

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

        3.echo "/var/log/messages" | sed 's@[^/]\+$@@'

          echo "/var/log/messages/" | sed 's@[^/]\+/\?$@@'  //基本的正規表達式,\?需要轉義:可有可無

          echo "/var/log/messages/" | sed -r 's@[^/]+/?$@@'    //擴充的正規表達式

三、進階編輯指令

        h H    Copy/append pattern space to hold space. p-&gt;h

        g G    Copy/append hold space to pattern space. h-&gt;p

            g:get

            大寫的為追加,小寫的為複制

        x:把兩組空間互換,exchange

        n N    Read/append  the  next line of input into the pattern space.

        d 删除模式空間中的行

        D:删除多行模式空間中的行

    示例:

        sed -n 'n;p' /etc/fstab //顯示偶數行,n為下一行,分号用于分割指令

        sed ‘1!G' /etc/fstab //除了第一行,都追加一行空白

        sed '1!G;h;$!d' /etc/fstab

                //覆寫模式空間到hold空間,最後一行不删除,其他都删除{删除模式空間的第幾行}

                //逆序顯示檔案内容

        sed '$!d' /etc/fstab  //不是最後一行就删除

        sed '$!N;$!D’ file  //隻顯示最後兩行

            $!N //不是最後一行,追加下一行到模式空間

                倒數第二行,追加最後一行後結束

            $!D //不是最後一行,都删除,

                倒數第二行的時候,追加的是最後一行,是以不删除

        sed '/^$/d;G' /etc/fstab //删除原有的所有空白行,而後為所有的非空白行,後添加一個空白行

        sed 'n;d' file //顯示奇數行

        sed 'G' file //在每行後都追加一個空白行

    sed -i '/^UUID/d' fstab //在原有的檔案上修改    

注意:任何時候,删除和修改的時候,先備份

本文轉自MT_IT51CTO部落格,原文連結:http://blog.51cto.com/hmtk520/1950194,如需轉載請自行聯系原作者