Linux腳本利器sed

sed正則表達式


文本例子使用如下文件
 $pg quote.txt
 The honeysuckle band played all night long for only $90.
 It was an evening of splendid music and company.
 Too bad the disco floor fell through at 23:10.
 The local nurse Miss P.Neave was in attendance.sql


1 sed怎樣讀取數據
   sed從文件的一個文本行或從標準輸入的幾種格式中讀取數據,將之拷貝到一個編輯緩衝區,而後讀命令行或腳本的第一條
命令,並使用這些命令查找模式或定位行號編輯它。重複此過程直到命令結束。shell


2 調用sed
   調用sed有三種方式:
       在命令行鍵入命令;
       將sed命令插入腳本文件,而後調用sed;
       將sed命令插入腳本文件,並使sed腳本可執行。
   使用sed命令行格式爲:
        sed [選項] sed命令  輸入文件
   記住在命令行使用sed命令時,實際命令要加單引號。sed也容許加雙引號。
   使用sed腳本文件,格式爲:
        sed [選項] -f sed腳本文件   輸入文件
   要使用第一行具備sed命令解釋器的sed腳本文件,其格式爲:
        sed腳本文件  [選項]  輸入文件
   不論是使用shell命令行方式或腳本文件方式,若是沒有指定輸入文件,sed從標準輸入中接受輸入,通常是鍵盤或重定向結果。
   sed選項以下:
       n 不打印;sed不寫編輯行到標準輸出,缺省爲打印全部行(編輯和未編輯)。p命令能夠用來打印編輯行。
       c 下一命令是編輯命令。使用多項編輯時加入此選項。若是隻用到一條sed命令,此選項無用,但指定它也沒有關係。
       f 若是正在調用sed腳本文件,使用此選項。此選項通知sed一個腳本文件支持全部的sed命令,
         例如:sed -f myscript.sed input_file,這裏myscript.sed即爲支持sed命令的文件數據庫


2.1 使用sed在文件中查詢文本的方式
   sed瀏覽輸入文件時,缺省從第一行開始,有兩種方式定位文本:
   1) 使用行號,能夠是一個簡單數字,或是一個行號範圍。
   2) 使用正則表達式。
                      使用sed在文件中定位文本的方式
            x                    x爲一行號,如1
            x,y                  表示行號範圍從x到y,如2,5表示從第2行到第5行
            /pattern/            查詢包含模式的行。例如/disk/或/[a-z]/
            /pattern/pattern/    查詢包含兩個模式的行。例如/disk/disks/
            pattern/,x           在給定行號上查詢包含模式的行。如/ribbon/,3
            x,/pattern/          經過行號和模式查詢匹配行。 3,/vdu/
            x,y!                 查詢不包含指定行號x和y的行。1,2!app


2.2 基本sed編輯命令
       sed編輯命令
    p         打印匹配行
    =         顯示文件行號
    a\        在定位行號後附加新文本信息
    i\        在定位行號後插入新文本信息
    d         刪除定位行
    c\        用新文本替換定位文本
    s         使用替換模式替換相應模式
    &         與s配合使用,在行中插入文本
    r         從另外一個文件中讀文本
    w         寫文本到一個文件
    q         第一個模式匹配完成後推出或當即推出
    l         顯示與八進制ASCII代碼等價的控制字符
    {}        在定位行執行的命令組
    n         從另外一個文件中讀文本下一行,並附加在下一行
    g         將模式2粘貼到/pattern n/
    y         傳送字符
    n         延續到下一輸入行;容許跨行的模式匹配語句ide


2.3 打印文本 example
$sed -n '2p' quote.txt                           (打印第二行)
$sed -n '$p' quote.txt                           (打印最後一行)
$sed -n '1,3p' quote.txt                         (打印第1~3行)
$sed -n '/Neave/'p quote.txt                     (打印匹配Neave的行)
$sed -n '4,/The/'p quote.txt                     (在第四行匹配模式The,若匹配,則打印)
$sed -n '/\$/'p quote.txt            (匹配元字符$)
$sed -n '1,$'p quote.txt                         (打印整個文件,只需將行範圍設爲第一行到最後一行1,$. $意爲最後一行)
$sed -n '/.*ing/'p quote.txt                     (任意字符:使用模式/.*ing/查詢以ing結尾的任意單詞)
$sed -n '/music/=' quote.txt                     (打印匹配行的行號)
$sed -n -e '/music/p' -e '/music/=' quote.txt    (打印匹配行的內容和行號)spa

$sed '=' quote.txt | tail -2                     (顯示行數或最大行號)命令行

2.4 建立sed腳本文件 || sed用法ip

2.4.1附加文本 a\
  $chmod u+x append.sed
  $pg append.sed
  #!/bin/sed -f
  /company/ a\
  Then suddenly it happened.
  運行腳本:$append.sed quote.txt
      第二行以/company/開始,這是附加操做起始位置. a\通知sed這是一個附加操做,首先應插入一個新行。第三行是附加操做
  要加入到拷貝的實際文本。輸出顯示附加結果。字符串

2.4.2插入文本 i\
  插入命令相似於附加命令,只是在指定行前面插入。和附加命令同樣,它也只接受一個地址。
  下面腳本使用行號指定文本插入位置,插入位置在模式或指定行號4以前。腳本以下:
  #!/bin/sed -f
  4 i\
  Utter insert ok.

2.4.3修改文本 c\
  修改命令將在匹配模式空間的指定行用新文本加以替代
     將第一行The honeysuckle band played all night long for only $90替換爲The office Dibble band played well。首先要
  匹配第一行的任何部分,可以使用模式'/Honeysuckle/'。sed腳本文件爲change.sed。內容以下:
  $pg change.sed
  #!/bin/sed -f
  /Honeysuckle/ c\
  The office Dibble band played well.
  像插入動做同樣,可使用行號代替模式,兩種方式A完成相同的功能。
  #!/bin/sed -f
  3 c\
  The office Dibble band played well.

2.4.4刪除文本 d
  sed刪除文本格式:[address[,address]]d
  地址能夠是行的範圍或模式,example as:
  $sed '1d' quote.txt              刪除第一行
  $sed '1,3'd quote.txt            刪除第一到第三行
  $sed '$d' quote.txt              刪除最後一行
  $sed '/Neave/d' quote.txt        刪除包含文本'Neave'的行
  $sed '-e/Neave/d' quote.txt      刪除包含文本'Neave'的行

2.4.5替換文本 s
  替換命令用替換模式替換指定模式,格式爲:[address[,address]] s/pattern-to-find/replacement-pattern/[g p w n]
    s選項 通知sed這是一個替換操做,並查詢pattern-to-find,成功後用replacement-pattern替換它。
    替換選項以下:
       g     缺省狀況下只替換第一次出現模式,使用g選項替換全局全部出現模式。
       p     缺省sed將全部被替換行寫入標準輸出,加p選項將使-n選項無效。
      -n     選項不打印輸出結果。
       w     文件名使用此選項將輸出定向到一個文件。
  example:
  $sed 's/night/NIGHT/' quote.txt                  (替換night爲NIGHT(第一個)  )
  $sed 's/\$//' quote.txt                   (替換$符號爲空白--即刪除$符號)
  $sed 's/The/hehe/g' quote.txt                    (替換全部的The爲hehe)
  $sed 's/night/lghti/w sed.out' quote.txt         (替換結果寫入文件sed.out)

2.4.6 使用替換文本模式插入 (&)
  若是要附加或修改一個字符串,可使用(&)命令,&命令保存發現模式以便從新調用它,而後把它放在替換字符串裏面。
即先給出一個被替換模式,而後是一個準備附加在第一個模式後的另外一個模式,而且後面帶有&,這樣修改模式將放在匹配模
式以前。例如,sed語句s/nurse/"Hello" &/p 的結果以下:  
  $sed -n 's/nurse/"Hello" &/p' quote.txt
  此句在nurse 以前加上"Hello "
  $sed 's/[0-9][0-9]*/& Passwd/g' ok.txt
  此句在文本ok.txt中,在全部的單個或連續數字後面加上'Passwd'.
  $sed 's/[0-9][0-9][0-9]*/& Passwd/g' ok.txt
  此句在文本ok.txt中,在全部的2個或2個以上連續數字後面加上'Passwd'.


2.4.7 從文件中讀文本 r
  $sed '/company/r sedin.txt' quote.txt      (在quote.txt的匹配行後插入文本sedin.txt的內容)

2.4.8 首次匹配後退出 q
  $sed  '/.a.*/q' quote.txt                        (匹配"任意字符後跟字符a,再跟任意字符0次或任意屢次",首次匹配後退出)


2.5 使用系統sed
   sed的基本功能,可是在腳本或命令行中使用sed真正要作的是修改或刪除文件或字符串中文本。

2.5.1 處理控制字符
   使用sed實現的一個重要功能是在另外一個系統中下載的文件中剔除控制字符。
   下面是傳送過來的文件(dos.txt)的部分腳本, 必須去除全部可疑字符,以便於賬號全部者使用文件。
   $pg dos.txt
   12332##DISO##45.12^M
   00332##LPSO##23.11^M
   01299##USPD##34.46^M
   進行以下操做:
  1) 用一個空格替換全部的(##)符號。
  2) 除起始域中最前面的0(00)。
   3)  刪除行尾控制字符(^M)。
   4)  刪除行首數字
   一些系統中,回車符爲^@和^L,若是遇到一些怪異的字符,沒必要擔憂,只要是在行尾而且全都相同就能夠。
   按步執行每一項任務,以保證在進行到下一任務前獲得理想結果。使用輸入文件dos.txt。
   任務1    刪除全部的#字符很容易,可使用全局替換命令。這裏用一個空格替換兩個或更多的#符號。
   $sed 's/##*/ /g' dos.txt                 (s -- 替換 ; g -- 全部 )
   12332 DISO 45.12^M
   00332 LPSO 23.11^M
   01299 USPD 34.46^M
   任務2  刪除全部行首的0。 ^0*表示行首任意個0。模式s/^0*//g設置替換部分爲空,即爲刪除模式,正是要求所在。
  $sed 's/^0*//g' dos.txt
   12332##DISO##45.12^M
   332##LPSO##23.11^M
   1299##USPD##34.46^M
   任務3    最後去除行尾^M符號,爲此需作全局替換。設置替換部分爲空。模式爲:'s/^m/ /g',注意'^M',這是一個控制字符。
        要產生控制字符(^M),需聽從前面產生F1鍵一樣的處理過程。步驟以下;鍵入sed s/,而後按住<Ctrl>鍵和v鍵,釋放v鍵,
        再按住^鍵,並保持<Ctrl>鍵不動,再釋放兩個鍵,最後按<return>鍵。下面命令去除行尾^M字符。
   $sed 's/^M//g' dos.txt
   以上三步,也可以使用一條命令實現:
   $cat dos.txt | sed 's/##*/ /g' |sed 's/^0*//g' |sed 's/^M//g'
   放在腳本里實現以下:
   $pg dos.sed
   #!/bin/sed -f
   ### to call : dos.sed dos.txt
   s/##*/ /g
   s/^0*//g
   s/\^M//g
   #### END

   任務4    刪除行首數字
   $sed 's/^[0-9]*//g' dos.txt


2.5.2 處理報文輸出
   當從數據庫中執行語句輸出時,一旦有了輸出結果,腳本便可作進一步處理。一般先作一些整理,下面是一個sql查詢結果。
  Database     size    date created
  ------------------------------
  gosouth       2244    12/11/97
  trisud        5632    8/9/99

  (2 rows affected)

   爲了使用上述輸出信息作進一步自動處理,須要知道所存數據庫名稱,爲此需執行如下操做:
  1) 使用s/-*//g刪除橫線------。
  2) 使用/^$/d刪除空行。                  (注意空行表示爲^$)
  3) 使用$d刪除最後一行
  4) 使用1d刪除第一行。
  5) 使用awk {print $1}打印第一列。
  命令以下,這裏使用了cat,並管道傳送結果到sed命令。

  $ cat sql.txt | sed 's/-*//g' | sed '/^$/d' | sed '$d' | sed '1d' | awk '{print $1}'
  gosouth
  trisud


2.5.3 從shell向sed傳值
   要從命令行中向sed傳值,值得注意的是用雙引號,不然功能不執行。
   $NAME="It's a go situation"
   $REPLACE="GO"
   $echo $NAME | sed "s/go/$REPLACE/g"
   It's a GO situation

2.5.4 從sed輸出中設置shell變量
   從sed輸出中設置shell變量是一個簡單的替換過程。運用上面的例子,建立shell變量NEW_NAME,保存上述sed例子的輸出結果。
   $NAME="It's a go situation"
   $REPLACE="GO"
   $NEW_NAME= 'echo $NAME | sed "s/go/$REPLACE/g"'
   $echo $NEW_NAME
   It's a GO situation


2.6  快速命令
   下面是一些一行命令集。([h]表示空格,[ ]表示tab鍵)
     's/.$//g'               刪除結尾最後一個字符
     's/\.$//g'              刪除結尾句點
         '/\.$/d'                             刪除以句點結尾行
         '/.$/d'                             刪除全部行
         '/^./d'                             刪除全部行
     '-e/abcd/d'              刪除包含abcd的行
     's/[][][]*/[]/g'                     刪除一個以上空格,用一個空格代替
     's/^[][]*//g'                        刪除行首空格
     's/\.[][]*/[]/g'                     刪除句點後跟兩個或更多空格,代之以一個空格
     '/^$/d'                              刪除空行  (僅有空格的行不能刪除)
     '/^[[:space:]]*$/d'                  刪除空行  (包括僅有空格的行)
     's/^.//g'                            刪除第一個字符
     's/COL\(...\)//g'                    刪除COL及緊跟COL的後三個字母
     's/COL...//g'                     刪除COL及緊跟COL的後三個字母
     's/^\///g'                           從路徑中刪除第一個\
     's/[]/[ ]/g'                         刪除全部空格並用tab鍵替代
     's/^[ ]//g'                          刪除行首全部tab鍵
     's/[ ]*//g'                          刪除全部tab鍵

  example:   1. 刪除路徑名第一個\符號   將當前工做目錄返回給sed,刪除第一個\:   $pwd | sed 's/^\///g'   2. 追加/插入文本   將"Mr Willis"字串返回給sed並在Mr後而追加"Bruce"。   $echo "Mr Willis" | sed 's/Mr/& Bruce/g'   3. 刪除首字符   sed刪除字符串"accounts.doc"首字符。   $echo "accounts.doc" | sed 's/^.//g'   4. 刪除文件擴展名   sed刪除"accounts.doc"文件擴展名。   $echo "accounts.doc" | sed 's/\....//g'   5. 增長文件擴展名   sed附加字符串".doc"到字符串"accounts"。   $echo "accounts" | sed 's/$/.doc/g'

相關文章
相關標籤/搜索