文本處理三劍客之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 10:22

相關推薦

  • vim文本編輯器之快捷鍵滿天飛

    vim文本編輯器不同于nano的是其功能非常強大,強大的功能還支持各種快捷鍵,讓我們編輯文本的時候更方便更快捷。 本文將會按照下圖所展示的功能來對命令一一講解,           打開文件:       &n…

    Linux干貨 2016-08-11
  • Hadoop HDFS分布式文件系統設計要點與架構

    Hadoop簡介:一個分布式系統基礎架構,由Apache基金會開發。用戶可以在不了解分布式底層細節的情況下,開發分布式程序。充分利用集群的威力高速運算和存儲。Hadoop實現了一個分布式文件系統(Hadoop Distributed File System),簡稱HDFS。HDFS有著高容錯性的特點,并且設計用來部署在低廉的(low-cost)硬件…

    Linux干貨 2015-04-13
  • mysql主從復制及zabbix監控從服務器

    Mysql備份: 備份系統的構建,要注意的要點: 第一:能容忍最多丟失多少數據; 第二:恢復數據需要在多長時間內完成; 第三:需要恢復哪些數據:備份時要考慮備份完整; (1)必須做還原測試,用于測試備份的可用性; (2)還原演練;不是一個人能夠完成的; 備份類型: 完全備份:就是備份整個數據集,是從時間軸上劃分的,完整數據集;; 部分備份:只備份數據子集; …

    Linux干貨 2016-12-05
  • Linux程序包管理(二)YUM使用

    YUM Linux程序包管理(二) 說完了程序包管理以及rpm的相關使用,接下來說說rpm的前端管理工具 YUM YUM是什么? &emsp;&emsp;&emsp;前面提到,yum是rpm程序包管理器的前端管理工具,那么yum到底是什么?又能做什么呢? YUM:yellow dog,Yellowdog Update Mod…

    Linux干貨 2016-06-01
  • Linux前端包管理器—yum

    Yum(Yellow dog Updater, Modified)由Duke University團隊,修改Yellow Dog Linux的Yellow Dog Updater開發而成,是一個基于RPM包管理的字符前端軟件包管理器。能夠從指定的服務器自動下載RPM包并且安裝,可以處理依賴性關系,并且一次安裝所有依賴的軟件包,無須繁瑣地一次次下載、安裝。 介…

    Linux干貨 2016-08-29
  • RPM總結(一)

    軟件包基礎軟件包運行環境硬件、內核、應用程序的關系包管理器程序包管理器Linux不同系統上的包管理器RPM的優點rpm包命名方式一般源代碼的命名rpm包的命名rpm包的分類與拆包包管理工具RPM包管理器:程序包管理器:獲取程序包的途徑:rpm包管理CentOS系統上使用rpm命令管理程序包:安裝升級:降級降級實例more 軟件包基礎 包管理過程中,最常用的操…

    Linux干貨 2016-08-24
欧美性久久久久