1. 程式人生 > >文本處理工具sed

文本處理工具sed

tab 要求 fault oot stream 修飾 第一個 editor pre

sed:stream Editor流編輯器,默認不編輯原文件,僅對模式空間中的數據做處理;而後,處理結束後,將模式空間打印至屏幕。
語法:

    sed [option] ‘AddressCommand‘ file1 file2...

option選項有:

    -n :靜默模式,不再顯示模式空間的內容
    -i :直接修改源文件
    -r :使用擴展正則表達式

Address常用的匹配範圍:

    1、startLine,endLine
            如:1,100 表示從第一行到100行,$表示最後一行
    2、/RegEXP/ 正則匹配,將匹配到的行顯示出來
            如:/root/ 將匹配到有root的行顯示
    3、/pattern1/,/pattern2/,從第一次匹配到pattern1開始到匹配到pattern2的行結束的中間的行
    4、LineNumber匹配指定的行
    5、startLine,+N,從startLine開始,往後的N行

command常用命令

    d:刪除匹配到的行
    p:顯示符合條件的行
    a \string :在匹配當的行後面追加string的內容
    i \string : 在匹配當的行前面添加string的內容
    r file :將file文件的內容添加到匹配到的行出
    w file :將匹配到的行添加到file文件中
    s/pattern/string/修飾符 :將匹配到的pattern替換成string,默認是替換第一個被匹配到的
                    常用的修飾符有:
                            i :忽略大小寫
                            g :全局替換

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

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

2、替換/etc/inittab文件中"id:3:initdefault:"一行中的數字為5;

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

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

    sed ‘/^$/d‘ /etc/inittab

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

    sed -r ‘s@^#@@g‘ /etc/inittab

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

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

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

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

7、取出一個文件路徑的目錄名稱;如取出/etc/inittab文件的目錄,即/etc

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

    echo ‘/etc/inittab‘ | sed -r ‘s#^(/.*)/(.*)#\1#‘

基名/文件名:

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

    echo ‘/etc/inittab‘ | sed -r ‘s#^(/.*)/(.*)#\2#‘

需要註意的是,如果要替換原文見的內容要加 -i 參數,sed 中的///,可以使用###或@@@等字符代替。
p的 command參數也要註意下,匹配到的行將會顯示兩次,沒匹配到的顯示一次,如果顯示兩次的,第一次是 p的的作用將匹配到的行打印出來,第二次是sed命令的作用,會將模式空間的內容顯示出來,所以說沒匹配到的也會顯示一次,如果想只顯示一次可以加 -n 參數,那麽sed命令中模式空間的內容不顯示。

文本處理工具sed