文本三劍客之sed

sed:stream editor(流編輯器)

工作特性:並不直接處理文本文件本身,處理機制爲每當處理一個文件的時候,它會逐行讀取,每次把一行讀取到內存空間中去,而後在模式空間(pattern space)中完成編輯.並把編輯好的結果輸出到屏幕上

 功      能:數據替換、刪除、增加、等,數據爲關鍵字或者一整行,

模式空間:默認不編輯原文件,僅對模式空間中的數據做處理,處理結束後,把模式空間中的內容輸出到屏幕上。

保持空間:在模式空間中處理一行內容會繼續處理下一行,那麼對於處理過的行可能還有其他處理,因此可以先把處理好的數據存放在hold space 中,然後等到全部處理好之後在回到模式空間中。



用法:

sed [OPTION]... script-only-if-no-other-script} [input-file]...
  script:指明要對指定位置做什麼動作
          地址定界編輯命令(中間沒有空格)


option:

        -n:不輸出模式空間中沒被匹配到的內容,被匹配到的內容根據編輯命令決定是否輸出

            從文件中讀取行然後通過模式進行處理,如果不予給定模式相匹配,那麼系統默認會將這些不匹配模式的行輸出到屏幕上,n選項的作用就是不顯示此類行,對於能匹配到的行,則通過編輯命令來決定是否輸出(如:d就直接刪除,p爲顯示)

        - r:支持擴展正則表達式                   

            指定地址定界中使用pattern匹配是使用擴展正則表達式

        -e:多個編輯命令對一個文件進行編輯 

            指定的多個script來處理輸入的文本文件

        - f:從文件中讀取編輯命令                 

            從文件中讀取script來處理輸出的文本文件

        - i:直接修改原文件                           

            將更改過的內容保存到原文件



地址定界:指定文本地址進行編輯

空地址:全文處理
#:指定文本中的某一行
/pattern/:被模式匹配到的每一行
#,#:從第幾行到第幾行
#,+#:從幾行開始的向下幾行
#,/pattern/:從指定的行到第一次被pattern匹配到的行之間的所有行
1~2:從第一行開始每隔一行      奇數行
2~2:從第二行開始每隔一行      偶數行


編輯命令:對指定的關鍵字或行進行編輯命令處理

    d:刪除模式空間中的內容

1.sed  'd'  sed.txt    //刪除全文
2.sed  ‘1d’  sed.txt    //刪除第1行
3.sed  ‘/^[[:digit:]]/d'  sed.txt    //刪除以數字開頭的所有行
4.sed  '1,5d' sed.txt    //刪除第1行到第5行
5.sed  '3,+3' sed.txt    //刪除第3行及以下的3行(一共刪除了4行)
6.sed   '1,/^14/d  sed.txt     //刪除第1行到第一次匹配到以數字“14”開頭的行之間的所有行
7.sed   '1~2d'  sed.txt    //從第1行開始,每隔1行刪除1行(刪除2、4、6、8……)顯示奇數行
8.sed    '2~2d'  sed.txt    //從第2行開始,每隔1行刪除1行(刪除1、3、5、7……)顯示偶數行

   

    p:打印模式空間中的內容         (顯示被指定的地址定界範圍所框定的內容,而不是模式空間中的所有內容)

1.sed   '1,3p' sed   //顯示第1行到第三行(原有的文件裏的會重複顯示一次,加上匹配到的第1到3行也會顯示)
2.sed  -n  '1,3p' sed   //此時原文件中的行就不會顯示來了(n 爲不打印原文件中的行,接着被匹配到的行根據編輯命令來決定動作)


    a \test:在指定行後面添加文本行,內容爲“\test”,支持使用\n實現多行插入

sed '/^[^[:digit:]]/a  \hello world '   sed.txt     
  //給文件中以非數字開頭的所有行的下方添加新行,內容爲“hello world”


    i  \test:在指定行前面插入文本行,內容爲“\test",支持使用\n實現多行插入  

sed '/^[[:digit:]]/i  \hello world '   sed.txt    
   //給文件中以數字開頭的所有行的上方添加新行,內容爲“hello world”


    c \test:把匹配到的行替換成爲此處指定的文本內容"\test"(整行替換)              

sed '/^[[:digit:]]/c \hello world' sed.txt     
   //把文件中所有以數字開頭的行內容覆蓋爲指定的內容“hello world”


    w /path/to/somefile:保存模式空間中匹配到的行至指定文件中                         

  sed ’/^#/w /testdir/#.txt  sed.txt  
    //將文件中以#號開頭的行另存到 (/testdir/#.txt)文件中。


    s  /path/from/somefile:讀取指定文件中的內容到當前模式指定的行後面         


  sed '1r /etc/issue' sed.txt     
    //將/etc/issue文件中的內容讀取到sed.txt文件中的第1行後面


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

    sed  '/^#/='  sed.txt     //給sed.txt文件首行爲#號開頭的行在其上方添加行號


!:條件取反                           

sed  '/^[[:digit:]]/!d'  sed.txt    //刪除sed.txt文件中不以數字開頭的行


s/pattern/string/修飾符:查找替換(默認只替換每一行中第一次被模式匹配到的字符串)

 將每一行當中能被模式匹配到的字符串替換成string字符串

sed 's@[[:digit:]]@AAA@g' sed     //將sed.txt文件中的數字全局替換成爲字符”AAA“


    其中: 1.“@”符爲分割符,可任意更改分隔符,但三個分割符必須爲一致

        第1個@與第2個@之間的內容爲地址定界,(就是我們需要替換的原內容)
        第2個@與第3個@之間的內容爲轉換內容,(將前面需要替換的內容更改爲此處的內容)
        第3個@符後面的爲修飾符,用於更改系統默認的一些操作


      2、history | sed -r 's@^[[:space:]]+@@'
         //將history列表中的行首爲一個空格字符以上字符不顯示(最後兩個@@中間沒有內容,就代表空,就表示把前面的替換成空,就相當於刪除行首的空格字符)


            修飾符(替換標記):加修飾符更改默認操作

               g:全局替換

                    系統默認是隻操作每一行的首次匹配到的字符,如果一行後面還有符合條件的就不在執行。在最後一個@緊跟g,則表示全局符合條件的都執行操作。


                i:查找時忽略字符

            當我們在查找某字母時用的是小寫,然則我們要把這些字母轉換爲其他的字符或字母,如果我們指定的字母爲小寫,那麼系統默認只更改小寫字母。

                     如果加上“ i  ”,則不區分大小寫,只要同字母就都執行


              w:將替換成功的結果保存到指定的文件中

          history | sed -r 's@^[[:space:]]+@#@w sed.txt2'       
                //  將轉換成功的結果保存到sed.txt2文件中

              & 已匹配字符串標記(調用之前匹配到的字符串,位置任意)

         sed 's/^192.168.0.1/&localhost/' file
        //


示例:  

      1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符                                            

        [root@localhost test]# sed -r  's/^[[:space:]]+//' /etc/grub.conf


       2、刪除/etc/fstab文件中所有以#開頭,後面至少跟一個空白字符的行的行首的#和空白字符          

         sed 's/^#[[:space:]]\+//' /etc/fstab
         sed -r 's/^(#|[[:space:]]+)//' /etc/fstab


      3、在/root/install.log每一行行首增加#號                                                                                 

        sed 's/^/#/' /root/install.log


      4、在/etc/fstab文件中不以#開頭的行的行首增加#號                                                                 

        sed 's/^[^#]/#/' fstab


      5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名                                                            

基名:echo "/etc/sysconfig/network-scripts/" | sed -r 's@.*/([^/]+)/?@\1@'
目錄:1.echo "/etc/sysconfig/network-scripts/" | sed -r 's@[^/]+/?$@@'
      2.echo "/etc/sysconfig/network-scripts/" | sed -r 's@(.*/)[^/]+/?@\1@'


       6、利用sed 取出ifconfig命令中本機的IPv4地址                                                                        

     取出:ifconfig | sed -r -n  's@(\b([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|2[0-2][0-3]])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\b)@\1\3\5\7@p
      驗證:ifconfig | sed -r -n  's@(\b([1-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|2[0-2][0-3]])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\b\.)(\b([0-9]|1[0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-4])\b)@this is ip addr@p



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