文本處理三劍客之sed

概述

    經過上篇對正則表達式和grep相關內容的學習,我們對文本處理有了一個初步的認識,本篇將簡要介紹一下文本處理三劍客之sed。具體分為以下幾個部分:

    1、sed原理概述

    2、sed命令詳解

第一部分    sed原理概述

    1、sed是什么

        sed是一種流編輯器,它一次處理一行內容。處理時,把當前處理的行存儲在臨時緩沖區中,稱為模式空間,接著用sed命令處理緩沖區中的內容,處理完成后,如果有需要進一步處理,就把模式空間的內容送到保持空間,如果不需要進一步處理,把模式空間的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出或者使用-i選項指定修改原文件。 sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等。

    2、sed的模式空間和保持空間的理解

        模式空間和保持空間,實際上就是sed用來完成數據處理的兩段內存空間,其中模式空間用來存儲從文檔中讀取出來的數據,根據指定的處理動作完成對數據的處理,如果在模式空間的數據一次處理后,無法滿足要求或需要后續的行進行配合處理,就需再將該行數據放到保持空間,根據需要從模式空間和保持空間之間調度數據,完成更高一級的文件處理動作

    3、sed工作原理

    sed工作原理.png

第二部分    sed命令詳解

    1、sed命令語法格式:

        語法:sed [OPTION]…'SCRIPT' FILE…

        SCRIPT:地址定界和編輯命令的集合

        常用選項:

            -n  不輸出模式空間的內容至屏幕,也就是沒被模式匹配到的行,不輸出到屏幕(不指定的話,默認是輸出到屏幕)

                一般如果編輯命令不是d,都應該指明該選項

            -e SCRIPT  可以實現多個SCRIPT一起編輯(默認只能用一個SCRIPT)

            -f /PATH/TO/FILE  將各個SCRIPT寫到文件中,然后利用-f 導入sed,進行處理。該文件中的格式為每行一個編輯命令

            -r  表示支持使用擴展正則表達式

            -i  表示直接編輯原文件

                sed –iSTRING ‘s/dog/cat/g’ pets可以實現在改變原文件時,將原文件備份一份到原文件目錄下取名為源文件名后跟指定的STRING為文件名的文件

            blob.png

    2、sed中的地址定界

        <1>空地址:表示對全文處理

        <2>單地址:表示只對指定行進行處理

            數字:表示指定的行

            /PATTERN/:表示被此模式匹配到的每一行

            $  最后一行

        <3>地址范圍

            數字1,數字2  表示從第幾行到第幾行之間所有的行,包括數字指定的行本身

            數字1,+數字2  表示從第幾行開始,往后的多少行

            數字,/PATTERN/  表示從第幾行開始,到第一次能被模式匹配到的行結束

            /PATTERN1/,/PATTERN2/  表示第一次能被模式1匹配到的行開始,到第一次能被模式2匹配到的行結束

        <4>步進長度表示法:~

            1~2:表示從第1行開始,每次步進2(此例子表示的是奇數行)

            2~2:表示從第2行開始,每次步進2(此例子表示的是偶數行)

       

        地址定界示例:

        blob.png

        blob.png

    3、sed中的編輯命令

        d  表示刪除(此命令一般不能加-n選項,除此命令之外的其他命令都應該加上-n選項)

        p  顯示能夠被匹配到的模式空間的內容(一般要加上-n選項)

             例如:sed ‘1~2p’ /etc/fstab

                 表示顯示全部的內容,且奇數行顯示兩次,因為默認會顯示模式空間中的內容

                 sed -n ‘1~2p’ /etc/fstab表示只顯示奇數行的內容

        a  \TEXT 加在后面,表示在模式匹配到行后面追加指定的文本TEXT,支持使用\n(換行符)實現多行插入

        i  \TEXT 加在前面,表示在模式匹配到行前面加上指定的文本TEXT,支持使用\n(換行符)實現多行插入

        c  \TEXT 把匹配到的整行,替換為此處指定的文本TEXT

        w  /PATH/TO/FILE   保存模式空間中被模式匹配到的行另存為指定文件

        r  /PATH/TO/FILE   讀取指定文件的內容,至當前文件中被模式匹配到的行后面,文件合并

        =   為模式匹配到的行,打印行號,在匹配到的行的上方另起一行標注行號

        !  條件取反,!的位置在地址定界之后,編輯命令之前

        s///   查找替換,其分隔符可執行指定,常用的有s@@@,s###

            支持替換標記:

                g  表示全局替換(默認表示只替換第一次出現的地方)

                w  /PATH/TO/FILE  將替換成成功的結果保存至指定文件

                p  顯示替換成功的行

        blob.png 

        blob.png

        blob.png

        blob.png

    4、sed中的高級編輯命令

        h  表示把模式空間中的內容覆蓋至保持空間中

        H  表示把模式空間中的內容追加至保持空間中

        g  表示把保持空間中的內容覆蓋至模式空間中

        G  表示把保持空間中的內容追加至模式空間中

        x  表示把模式空間中的內容與保持空間中的內容互換

        n  表示讀取匹配到的行的下一行至模式空間中,覆蓋原行

        N  表示讀取匹配到的行的下一行至模式空間中,追加到原行后面

        d  表示刪除模式空間中的行

        D  表示刪除多行模式空間中的所有行

        示例:sed ‘1!G;h;$!d’ /etc/fstab  相當于逆序顯示文件內容

        分析此命令的過程:

        幾個編輯動作的意思:如果不是第一行,就做G操作,然后做h操作,然后如果不是最后一行,就做d操作

        第1行,因為是第一行,不做G操作,然后做h,將第一行的內容覆蓋到保持空間,然后不是第一行,刪除模式空間的內容,模式空間沒內容

        第2行,因為不是第一行,做G操作,將剛才保持空間中的第一行的信息追加到模式空間,此時模式空間有第2行和第1行,然后做h操作,將模式空間的第2行和第1行覆蓋到保持空間,此時保持空間有第2行和第1行,然后做d操作,刪除了模式空間的所有內容

        第3行,做G操作,故模式空間有了第3行,第2行和第1行,然后再進行h操作,此時保持空間中的內容有第3行第2行第1行,然后刪除模式空間

        ….

        最后一行:做G操作,把保持空間的內容追加到模式空間,然后再做h,把模式空間的內容覆蓋到保持空間,然后由于是最后一行,不做d操作,故,此時模式空間的內容是最后一行…第一行 ,逆序排序了

        然后sed的默認動作是把模式空間的內容輸出,故顯示的結果是將文件逆序排序

        blob.png

      

        

        sed ‘$!d’ FILE  表示顯示最后一行

        blob.png

        sed ‘$!N;$!D’ FILE  顯示文件的最后兩行的內容

        blob.png

        sed ‘/^$/d;G’ FILE  刪除原有的所有空白行,然后為每個非空白行后添加一個空白行

        blob.png

        sed ‘n;d’ FILE  顯示奇數行

        blob.png

        sed ‘G’ FILE   表示在原有的每行后面都加上一個空白行

        blob.png

    

    

原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/32100

(0)
M20-1倪文超M20-1倪文超
上一篇 2016-08-10 10:15
下一篇 2016-08-10

相關推薦

  • 馬哥教育網絡班22期+第2周課程練習

    1.linux上的文件管理類命令有哪些,其常用的使用方法及其相關示例演示    cp  復制文件  :單源;多源(目標必須是目錄)        cp  /etc/fstab /tmp/hi.txt     -i 覆蓋之前提醒用戶確認   …

    Linux干貨 2016-08-21
  • 高可用集群基本概念與heartbeat文本配置接口

    一、高可用集群基本概念:     什么是高可用集群:          所謂高可用集群,就是在出現故障時,可以把業務自動轉移到其他主機上并讓服務正常運行的集群構架     高可用集群的構架層…

    Linux干貨 2016-01-13
  • Nginx 常見配置解析

    結構上: 核心模塊:HTTP模塊、EVENT模塊、MAIL模塊。 基礎模塊:HTTP access模塊、HTTP FastCGI模塊、HTTP Proxy模塊、HTTP Rewrite模塊。 第三方模塊:HTTP Upstream Request Hash模塊。 功能上: Handlers…

    Linux干貨 2016-12-05
  • 第5周作業

    1、顯示當前系統上root、fedora或user1用戶的默認shell     ~]# egrep "^(root|fedora|user1)" /etc/passwd 2、找出/etc/rc.d/init.d/functions文件中某單詞后面跟一組小括號的行,如:hello();  …

    Linux干貨 2017-01-07
  • nfs和samba服務

    nfs:      nfs: Network File System                      #網絡文件系統      nis:Network Information Se…

    Linux干貨 2017-04-27
  • N26 – 第二周作業

    1、文件管理類命令和常用使用方法 2、bash命令執行后返回值,和目錄展開:     命令執行返回值,存儲在“$?”這個特殊變量內??梢允褂胑cho顯示或在shell腳本中引用。其中0表示正常執行完成,1-255表示不同的錯誤類型。     目錄展開的特殊符號:  &n…

    Linux干貨 2016-12-30
欧美性久久久久