Linux文本處理工具之sed

jopen 9年前發布 | 17K 次閱讀 Linux Sed

    概念:
        sed是一種在線編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩存區中,稱為"模式空間(pattern space)",接著用舍得命令處理緩沖區中的內容,處理完成后,把緩存區的內容輸出。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你是用重定向存儲輸出。sed主要用來編輯一個活多個文件。
    格式:
        sed [-nefri] 'command' 輸入文本
    常用選項:
        -n:使用安靜(silent)模式。在一般sed的用法中,所有來自STDIN的資料一般都會被列出到終端上。但如果加上-n參數之后,則只有經過sed特殊處理的那一行(或者動作)才會被列出來。
        -e:直接在指令列模式上進行sed的動作編輯
        -f:直接將sed的動作寫在一個檔案內,-f filename則可以執行filename內的sed動作
        -r:sed的動作支援的是延伸正規表示的語法(預設是幾次正規表示法的語法)
        -i:直接修改讀取的檔案內容,而不是由熒幕輸出
    動作說明:
        [n1[,n2]] 常用命令:不見得會存在,一般代表『選擇進行動作的行數』,舉例來說,如果我的動作是需要在 10 到 20 行之間進行的,則『 10,20[動作行為] 』

    常用命令:
        a:追加,a的后面可以接字符串,而這些字符串會在新的一行出現(目前的下一行)
        c:更改,c的后面可以接字符串,這些字符串可以取代n1,n2之間的行
        d:刪除,d的后面不接受任何東西
        i:插入,i的后面可以接字符串,而這些字符串會在新的一行出現(目前的上一行)
        p:列印,講某個選擇的資料印出,通常會與參數-n一起出現
        s:替換,可以直接進行替換的工作,sed 's/要替換的字符串/新的字符串/flags',這里修飾替換的標志flags有:
        g:表示在行內進行全局替換,而沒有g時通常只有第一次出現的時候被替換
        n:1-512之間的一個數字,表示對本模式中指定模式第n次出現的情況進行替換
        p:打印模式空間的內容
        w:將模式空間的內容寫入file中

    舉例:
        1.刪除某行
            a.sed '2d' file                   #刪除第二行
            b.sed '$d' file                   #刪除最后一行
            c.sed '1,5d' file                   #刪除第一行到第五行
            d.sed '5,$d' file                 #刪除第五行到最后一行
            e.sed '/My/,/You/d' file          #刪除包含"My"的行到包含"You"的行之間的行
            f.sed '/My/,10d' file              #刪除包含"My"的行到第十行的內容
            g.sed '/^$/d' file                 #刪除空行
        2.顯示某行
            a.sed -n '2p' file       #顯示第二行
            b.sed -n '$p' file    #顯示最后一行
            c.sed -n '1,5p' file  #顯示第一行到第五行
            d.sed -n '5,$p' file  #顯示第五行到最后一行
        3.模式進行查詢
            a.sed -n '/sed/p' file    #查詢包括關鍵字sed所在的所有行
            b.sed -n '/\$/p'  file    #查詢包括關鍵字$所在所有行,使用"\"屏蔽特殊含義
        4.增加一行或多行字符串
            a.sed '1a test' file             #在第一行后新增字符串"test"
            b.sed '1,3a test' file             #在第一行到第三行后新增字符串"test"
            c.sed '1a test\ntest' file         #在第一行后新增多行,使用換行符\n
        5.替代一行或者多行或者一行中的某部分
            a.sed '1c test' file             #第一行的內容替換為test
            b.sed '1,2c test' file             #第一行到第二行的內容替換為test
            c.sed '1,5s/a/A/' file             #第一到第五中的首個a替換為A
            d.sed '/B/s/a/A/g'  file         #將有B的行中的a替換為A
        6.插入
            a.sed -i '$a test' file     #在最后一行直接輸入test
        7.多點編輯
            a.sed -e '3,$d' -e 's/Test/test' file #先刪除第三行到最后一行的數據,然后將"Test"替換為"test",$需要和正則表達式的$區分開,在此處表示行的結束
            b.sed -e '3,$d; s/Test/test' file      #效果同上
        8.腳本
            a.講以下命令保存在一個文本中(sed-script)
                3i\
                ~~~~~
                3,$s/(hrwang) is (mjfan)/\2 is \1/
                $a\
                We will love eachother forever!!
            b. sed -f sed-script file
           上邊的腳本還可以進一步的優化
            a.將以下命令保持在一個sh腳本中(sed-script)
                #!/bin/sed -f
                3i\
                ~~~~~
                3,$s/(hrwang) is (mjfan)/\2 is \1/
                $a\
                We will love eachother forever
            b../sed-script file
    注意:
        1.sed -i 這個動作會直接修改到原始的文件,慎用。
        2.sed -e 這個動作表示多點編輯
        3.sed腳本就是寫在文件中的一系列sed命令。腳本中,要求命令的末尾不能有任何多余的空格或文本。如果在一行中有多個命令,要用分號分隔。執行腳本時,sed先將輸入文件中第一行復制到模式緩沖區,然后對其執行腳本中所有的命令。每一行處理完畢后,sed再復制文件中下一行到模式緩沖區,對其執行腳本中所有命令。使用sed腳本時,不再用引號來確保sed命令不被shell解釋。
        4.sed命令可以指定零個、一個或兩個地址。每個地址都是一個描述模式、行號或者行尋址符號的正則表達式。如果沒有指定地址,那么命令將應用于每一行;如果只有一個地址,那么命令應用于與這個地址匹配的任意行;如果指定了有逗號分隔的兩個地址,那么命令應用于匹配第一個地址的第一行和它后面的行,直到匹配第二個地址的行(包括此行),可以把第一個地址看做是啟用動作,并把第二個地址看做是禁用動作;如果地址后面跟有感嘆號(!),那么命令就應用于不匹配該地址的所有行。
    行定位的使用
        5.sed命令中c和s的區別(c直接更改,s替換)

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!