sed詳解與入門

來源:互聯網
上載者:User

標籤:style   使用   strong   os   檔案   資料   

        sed,stream editor,流編輯器,輸入一段文本,通過處理,得到修改的文本,一個很簡單卻又很複雜的功能,簡單在於只是處理文本,複雜在於需要支援文本處理的全部要求,增刪查改等功能。

源檔案file,下列操作都是以此檔案操作:

firstsecondthirdfirst sed

         增:

  1. 增加一行文字:sed ‘1 a this is a line‘ file;a代表append;

  2. firstthis is a linesecondthirdfirst sed
  3. 插入一行文字:sed ‘1 i this is a line‘ file;i代表insert;

  4. this is a linefirstsecondthirdfirst sed
  5. 在行首或行尾增加一個單詞:sed ‘s/^/#/‘ file;s代表substitute,^代表行首,$代表行尾;

  6. #first#second#third#first sed

        刪:

  1. 刪除一行文字:sed ‘2 d‘ file;d代表delete;

  2. firstthirdfirst sed
  3. 刪除多行文字:sed ‘2,3 d‘ file;2,3代表起始行號和終止行號;

  4. firstfirst sed
  5. 刪除某個單詞:sed ‘s/first//g‘ file;g代表global;替換全部first為空白,如果是數字n,則替換第n個first,如果是數字n和g,如2g,則替換第n個之後的first;

  6. secondthird sed

        查:

  1. 列印某行:sed -n ‘2 p‘ file;p代表print;

  2. second
  3. 列印多行:sed -n ‘1,2 p‘ file;-n選項代表不輸出模式空間的資料(什麼是模式空間後面會說);

  4. firstsecond
  5. 列印包含某個單詞的行: sed -n ‘/first/p‘ file;匹配first,也可以使用Regex;

  6. firstfirst sed
  7. 列印包含A單詞又包含B單詞的行:sed -n ‘{/first/{/sed/p}}‘ file;大括弧{}代表嵌套命令,先匹配first,在匹配sed,然後p,或者用d刪除等都可以;

  8. first sed
  9. 列印包含A單詞卻不包含B單詞的行:sed -n ‘{/first/{/sed/!p}}‘ file;驚嘆號!代表非,反操作;

  10. first
  11. 列印包含A單詞的後續幾行:sed -n ‘/second/,+1p‘ file;+1代表後續一行;

  12. secondthird
  13. 列印奇數或偶數行:sed -n ‘p;n‘ filesed -n ‘n;p‘ file;前者奇數行,後者偶數行;分號;代表執行多個sed命令,使用-e選項,如sed -e ‘……‘ -e ‘……‘ file 也有同樣效果;至於n命令後面會談到。

  14. firstthird
    secondfisrt sed

        改:

  1. 將A修改為B:sed ‘ s/first/one/g‘ file

  2. onesecondthirdone sed
  3. 將某行從小寫轉換為大寫:sed ‘2 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/‘ file;y代表yank(猜測與vim的y代表的意思是差不多的);其實就是映射,a映射為A,b映射為B;

  4. firstSECONDthirdfirst sed
  5. 替換某行的文字:sed ‘1 c abc‘ file;c代表change;

  6. abcsecondthirdfirst sed

    以上是sed的一些使用例子,下面談談它的其它內容。

    pattern space(模式空間)與選項-n

    模式空間在sed裡對初學者是特別難懂的一個東西,說白了,它就是一個緩衝區,將資料讀入緩衝區,在緩衝區處理,並輸出緩衝區的內容,這也就是為什麼不會修改源檔案的內容。

    至於選項-n,要求sed不輸出緩衝區的內容,大部分都只有列印時才會使用,大致流程如下虛擬碼:

    for line in file                        //迴圈讀入每行資料 do      pattern_space = line              //將當前行資料寫入模式空間      pattern_space = exec(sed_cmd,pattern_space)  //執行sed的命令,並將處理完的資料寫回模式空間      if "-n" no exist                  //如果沒有選項-n            print pattern_space         //則輸出模式空間的資料 done

    選項-i,直接修改源檔案

    上述的sed操作執行都不會對源檔案作任何改動,相當於copy了一個副本出來操作相應的命令,但如果我們需要直接在源檔案上修改,該怎麼辦,查man會知道,-i選項會使命令在源檔案上操作。

    地址

    在使用sed,命令的格式都類似這樣,“1,2s/a//g”,"2p","1,3d","/wo/,+3p","2!p","p";sed處理的資料,都有起始行,到結束行,限定一定的地區,大致的格式是這樣,[begin,[end]][!]cmd,begin或end可以由數字或者正則式表示。

    n與N

    看別人的sed腳步,有時會看到n與N命令,類似這樣的,sed -n ‘n;p‘ file,代表輸出偶數行,單獨的一個p肯定是輸出全部的,那多了個n為什麼就是偶數行?瞭解一下n或N命令做了什麼事。

    •  n,sed先讀取第一行到模式空間,調用n命令,讀取第二行,覆蓋模式空間;n>模式空間

    • N,sed先讀取第一行到模式空間,調用N命令,讀取第二行,追加到模式空間;N>>模式空間

        g與G、h與H、x

        這幾個命令,與另一概念有關,hold space,相當於模式空間的緩衝區,與n/N命令相似,g與h都是覆蓋,G與H都是追加;

        g: 將hold space中的內容拷貝到pattern space中,原來pattern space裡的內容清除

        G: 將hold space中的內容append到pattern space\n後

        h: 將pattern space中的內容拷貝到hold space中,原來的hold space裡的內容被清除

        H: 將pattern space中的內容append到hold space\n後

        x: 交換pattern space和hold space的內容

        舉個栗子:


pattern space
hold space
abc \n
g \n
\n
G abc\n
\n
h abc abc
H abc \nabc
x \n abc
    附:

    使用的一些相關正則:

    (^):開頭

    ($):結尾

    (\<):詞首

    (\>):詞尾

    (.):任何單字元

    (*):某個字元出現0次或多次

    ([  ]):字元集合

    (&):被匹配的變數

    (=):行號


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.