Linux中sed的用法

一、sed   流編輯器,實現對文字的增刪改替換查(過濾、取行),能同時處理多個文件多行的內容,能夠不對原文件改動,把整個文件輸入到屏幕,能夠把只匹配到模式的內容輸入到屏幕上。還能夠對原文件改動,可是不會再屏幕上返回結果。html


流程:Sed軟件從文件或管道中讀取一行,處理一行,輸出一行;再讀取一行,再處理一行,再輸出一行……正則表達式

模式空間:sed軟件內部的一個臨時緩存,用於存放讀取到的內容。緩存

024a9db2ed6afe0cd965754a8ff19b95.png

二、命令格式:sed  [選項]   [命令]   [輸入文件]bash

sed命令的經常使用選項:app

-n :只打印模式匹配的行,通常與 p 一塊兒使用。如:sed -n  ' 2p '  /data  表示輸出/data的第二行,如:sed  -n '20,30p'    /data/boy顯示 /data/boy的20到30行。編輯器

-e :進行多項編輯,即對輸入行應用多條sed命令時使用,此爲默認選項。如:sed -e '/^#/d'  -e '/^$/d'  /data/boy表示刪除空格的行和#開頭的行。ide


-f :將sed的動做寫在一個腳本文件內,用–f filename 執行filename內的sed動做。spa

-r :支持擴展表達式code

-i :直接修改文件內容,如:sed   -i   s#old#new#g    orm

經常使用基本命令:

   d        :delete, 刪除匹配到的行;
    p        :print,  顯示匹配到的行;一般 p 會與參數 sed -n 一塊兒用
    a \text:append, 在指定行後追加文本text,支持使用\n實現多行追加;
    i \text :insert, 在指定行前插入文本text,支持使用\n實現多行插入;
    c \text:將指定行的內容替換爲文本text;
    w /file:write, 保存模式空間中匹配到的行至指定的文件中;

    r /file :read, 將指定文件的內容讀取至當前模式空間中被匹配到的行後面,經常使用於實現文件合併;

                    sed  -i '/Ethernet/r myfile' test  匹配Ethernet的行,讀進來另外一個文件的內容,讀進來的文件的內容會插入到匹配Ethernet的行後  

    s/pattern/replaces/:查找pattern用replaces替換;分隔符可自行指定,經常使用的分隔符有/, #, @等;
    替換標記:
            g:全局替換;
            w /file:將替換的結果保存至指定文件中; sed -i  's/pattern/replaces/w my.txt'  test    將替換後的結果保存到my.txt
            p:顯示替換成功的行;

    

    y:用於(對應)轉換字符;

    =:打印行號;
    ! :匹配後取反;
    l :打印行號,並顯示控制字符;
    q:讀取匹配到的行後退出;

         
 

 三、sed在文件中查詢文本的方式



x/p
查詢第x行
sed -n '2p ' /data
x,y/p 查詢從x到y行 sed -n '1,3p ' /data
/pattern/p 查詢包含pattern的行 sed -n '/pattern/p' /data
/pattern 1/,/pattern 2/p 查詢包含pattern 1pattern 2的行 sed -n '/pn1/,/pn2/p'  /data
/pattern/,xp 查詢從包含pattern的行到x行
sed -n '/pn/,5p'  /data
x,/pattern/p 查詢從x到包含pattern的行 sed -n '5,/pn/p'  /data
x,y!p 查詢不包含指定行號x和y的行 sed -n '5,8!p'  /data
  1.      10{sed-commands}        對第10行操做

  2.    10,20{sed-commands}     對10到20行操做,包括第10,20行

  3.    10,+20{sed-commands}   對10到30(10+20)行操做,包括第10,30行

  4.    1~2{sed-commands}       對1,3,5,7,……行操做

  5.    10,${sed-commands}     對10到最後一行($表明最後一行)操做,包括第10行

  6.     /oldboy/{sed-commands}         對匹配oldboy的行操做

  7.     /oldboy/,/Alex/{sed-commands}  對匹配oldboy的行到匹配Alex的行操做

  8.     /oldboy/,${sed-commands}       對匹配oldboy的行到最後一行操做

  9.     /oldboy/,10{sed-commands}      對匹配oldboy的行到第10行操做,注意:若是前10行沒有匹配到oldboy,sed軟件會顯示10行之後的匹配oldboy的行,若是有。

  10.    1,/Alex/{sed-commands}         對第1行到匹配Alex的行操做

  11.    /oldboy/,+2{sed-commands}      對匹配oldboy的行到其後的2行操做




四、案例(sed 後不跟  -i  表示僅對輸出改變,對源文件不改變

  • 單行增長到第2行後:   sed '2a 106,dandan,CSO' person.txt

  • 單行增長到第2行前:   sed '2i 106,dandan,CSO' person.txt

  • 多行增長到第2行前:   sed '2i 106,dandan,CSO\n107,bingbing,CCO' person.txt,每行之間加換行符    \n

  • 刪除第二行:                   sed '2d' person.txt


  • 刪除匹配oldboy或者Alex的行                  sed '/oldboy/,/Alex/d' person.txt

  • 用新行替代第2行                      sed '2c 106,dandan,CSO' person.txt


  • 分組替換\( \)和\1的使用說明

sed軟件的\( \)的功能能夠記住正則表達式的一部分,其中,\1爲第一個記住的模式即第一個小括號中的匹配內容,\2第二記住的模式,即第二個小括號中的匹配內容,sed最多能夠記住9個。

例:echo I am oldboy teacher.若是想保留這一行的單詞oldboy,刪除剩下的部分,使用圓括號標記想保留的部分。

echo I am oldboy teacher. |sed 's#^.*am \([a-z].*\) tea.*$#\1#g'

思路:用oldboy字符替換I am oldboy teacher.

下面解釋用代替空格:

        ^.*am□ –>這句的意思是以任意字符開頭到am□爲止,匹配文件中的I am□字符串;

        \([a-z].*\)□–>這句的外殼就是括號\(\),裏面的[a-z]表示匹配26個字母的任何一個,[a-z].*合起來就是匹配任意多個字符,本題來講就是匹配oldboy字符串,因爲oldboy字符串是須要保留的,所以用括號括起來匹配,後面經過\1來取oldboy字符串。

        □tea.*$–>表示以空格tea起始,任意字符結尾,實際就是匹配oldboy字符串後,緊接着的字符串□teacher.;

後面被替換的內容中的\1就是取前面的括號裏的內容了,也就是咱們要的oldboy字符串。

        ()是擴展正則表達式的元字符,sed軟件默認識別基本正則表達式,想要使用擴展正則須要使用\轉義,即\(\)。sed使用-r選項則能夠識別擴展正則表達式,此時使用\(\)反而會出錯。

相關文章
相關標籤/搜索