Sed工做原理

 Sed工做原理正則表達式

 
sed是一個非交互式的流編輯器。所謂非交互式,是指使用sed只能在命令行下輸入編輯命令來編輯文本,而後在屏幕上查看輸出;而所謂流編輯器,是指sed每次只從文件(或輸入)讀入一行,而後對該行進行指定的處理,並將結果輸出到屏幕(除非取消了屏幕輸出又沒有顯式地使用打印命令),接着讀入下一行。整個文件像流水同樣被逐行處理而後逐行輸出。
 
下面咱們看一下sed的工做過程。
 
sed不是在原輸入上直接進行處理的,而是先將讀入的行放到緩衝區中,對緩衝區裏的內容進行處理,處理完畢後也不會寫回原文件(除非用shell的輸出重定向來保存結果),而是直接輸出到屏幕上。sed運行過程當中維護着兩個緩衝區,一個是活動的「模式空間(pattern space)」,另外一個是起輔助做用的「暫存緩衝區(holding space)」。通常狀況下,每當運行sedsed首先把第一行裝入模式空間,進行處理後輸出到屏幕,而後將第二行裝入模式空間替換掉模式空間裏原來的內容,而後進行處理,以此類推。
 
 
 
通常狀況下暫存緩衝區是用不到的,但有特殊的命令能夠在模式空間與暫存緩衝區之間交換數據,後文將有介紹。因爲sed對文本的全部操做都是在緩衝區裏進行的,因此不會對原文件形成任何破壞。
 

4.2            Sed命令格式shell

 
sed的命令格式以下:
 
sed [-Options] [‘Commands’] filename
 
其中,Command是一個sed命令,sed命令必定要被包含在一對單引號中,以避免被shell解釋,其格式以下:
 
[address-range][sed-command]或
[Pattern-to-match][sed-command]
 
address-range是指要處理的行的範圍,又叫地址範圍;pattern-to-match是一個要匹配的模式,是一個正則表達式,sed-command是一個sed命令,用來對指定的行進行處理。下面是一個簡單的例子:
 
sed –n ‘1,3p’ students
 
這個命令將文件students中的第13行打印到屏幕。注意,地址範圍和sed命令之間沒有空格,若是加入空格,sed也會將其忽略。參數-n用來取消默認輸出。默認狀況下,sed每讀入一行到模式空間,不管是否對其進行處理,在讀入下一行以前多要將模式空間中的內容輸出到屏幕上。參數-n能夠用來取消這種默認的輸出,只有當用戶用命令p時纔將指定的行輸出到屏幕。若是沒有用參數-n而又對指定行執行了p命令,那麼這些行將會被打印兩次。
 
地址範圍能夠是一個數字,這個數字表明瞭一個行號;也能夠是一個用逗號分隔的兩個數字表示的範圍(包括這兩行)。範圍能夠是數字,正則表達式,或是二者的組合。
 
pattern-to-match是一個要匹配的模式,sed將會對全部匹配的行執行sed-command。其實,這裏的pattern-to-match也能夠看做是一個地址,這個地址是全部與指定模式匹配的行的行號。所以sed的格式能夠概括爲一種:
 
sed [-Options] ‘[address-range][sed-command]’ filenam
 
              
sed命令:
    ## 按行處理,複製一行出來到本身專用--->模式空間(pattern space),而後匹配處理
    ## 保持空間(hold space)
    #
    文本處理三劍客:
        grep, egrep, fgrep:文本過濾器
        sed:Stream EDitor,流編輯器,行
        awk:文本格式化工具,報告生成器
        
    sed [OPTION]...  'script'  [input-file] ...
        script:
            地址定界編輯命令
            
        經常使用選項:
            -n:不輸出模式空間中的內容至屏幕;
            -e script, --expression=script:多點編輯;
            -f  /PATH/TO/SED_SCRIPT_FILE
                每行一個編輯命令;
            -r, --regexp-extended:支持使用擴展正則表達式;
            -i[SUFFIX], --in-place[=SUFFIX]:直接編輯原文件 ;
        
            ~]# sed  -e  's@^#[[:space:]]*@@'   -e  '/^UUID/d'  /etc/fstab
        
        地址定界:
            (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:顯示替換成功的行;
                
                練習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@[^/]+/?$@@'
                    
        高級編輯命令:
            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:在原有的每行後方添加一個空白行;
相關文章
相關標籤/搜索