Linux中的文本處理工具—sed

sed 處理文本工具


一、概述

  Stream EDitor,行編輯器

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

   sed 是一種非交互式的文本編輯器,通過給定條件自動的逐行去處理文件。

   grep是用來檢索關鍵字的,sed 卻是搜索匹配處理文本工具。

 

二、功能

   sed 所具有的功能:數據的替換,刪除,新增等,這里的數據可以是一些關鍵字,也可以是一些特定的行。


三、語法結構及用法:


  1.語法結構:sed [option]… 'script' inputfile…


  2.常用選

      -n:不輸出模式空間內容的自動打印(靜默模式)

      -e: 多點編輯,指定多腳本編輯

      -f /PATH/TO/SCRIPT_FILE: 從指定文件中讀取編輯腳本并運行。

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

      -i: 原處編輯(直接修改源文件) -i.back(備份)

wKioL1eqxQbio9SfAABT00bdq68462.png

  3.地址界定(抽取的域):

    (1) 不給地址:對全文進行處理

    (2) 單地址

           #: 表示數字,指定的行

             $:最后一行

            /pattern/:被此處模式所能夠匹配到的每一行

    (3) 地址范圍

        #1,#2 :從#1行,到#2行

        #,+n從#行開始,一直到向下的n行

wKiom1eqwm2STMUZAAAhF5hsOFE043.png

        /pat1/,/pat2/從第一次被pat1匹配到的行開始,到第一次被pat2匹配到的行結束,中間的所有行;

        #,/pat1/ 從#行開始,到第一次被pat1匹配到的行結束,中間的所有行。

wKioL1eqwu6yxP6wAAAWSlwycqg094.png

    (4) ~:步進,指定起始行及步長。

         1~2 奇數行

wKiom1eqwhHzCnk-AAAe2HSFkHg472.png

         2~2 偶數行

  4.編輯命令:

     

      d: 刪除模式空間匹配的

wKiom1eqwXaAh8zRAAAfQx3NjdE921.png

     p: 打印模式空間中的內容

wKiom1eqwZaTv9xjAAAweB7nNoE301.pngwKiom1eqwcuTZPx1AAAMvAdmUhE426.png

      a\text:在行后面追加文本;支持使用\n實現多行追加

wKioL1eqwzDB56jAAAA2X_hPA6s710.png

      i\text:在行前面插入文本;支持使用\n實現多行插入

      c\text:替換行為單行或多行文本

      w /path/to/somefile: 把指定的內容另存至/path/to/somefile路徑所指定的文件中。

wKiom1eqw1XCOVO3AAAXUzCEl6I980.png

      r /path/from/somefile:在文件的指定位置插入另一個文件的所有內容,完成文件合并。

wKioL1eqw22DLIWFAAAvJkBYCzY411.png

      = : 為模式空間中的行打印行號

wKiom1eqxCaRsiImAAAijvmwfWk743.png

      ! :模式空間中匹配行取反處理

wKioL1eqxEviOD0bAAApG4tuj8E167.png

   注意:這里添加或替換的內容,只是在模式空間中改變,原文件并沒有被修改,如果要修改源文件 加 -i 選項(慎用)


  5.查找替換(很重要):


s///:查找替換,支持使用其它分隔符s@@@,s###

  如:s/string1/string2/ 用string2 替換string1,string 可以是字符串也可以是正則表達式

   替換記:

      g: 行內全局替換

wKiom1eqxevjJ2PPAAAjXAsiO0s015.png

      p: 顯示替換成功的行

      w /PATH/TO/SOMEFILE :將替換成功的行保存至文件中

  6.sed示例:

      sed‘2p’ /etc/passwd

       sed–n ‘2p’ /etc/passwd

       sed–n ‘1,4p’ /etc/passwd

       sed–n ‘/root/p’ /etc/passwd

       sed–n ‘2,/root/p’ /etc/passwd2行開始

       sed-n ‘/^$/=’ file 顯示空行行號

       sed–n –e ‘/^$/p’ –e ‘/^$/=’ file

       sed‘/root/a\superman’ /etc/passwd行后

       sed‘/root/i\superman’ /etc/passwd行前

       sed‘/root/c\superman’ /etc/passwd代替行      

      sed‘/^$/d’ file   刪除空行

       sed‘1,10d’ file

       nl /etc/passwd| sed‘2,5d’

       nl /etc/passwd| sed‘2a\tea’

       sed's/test/mytest/g' example

       sed–n‘s/root/&superman/p’ /etc/passwd單詞后

wKiom1eqxhDRHi56AAAkLAEyNiY454.png

       sed–n‘s/root/superman&/p’ /etc/passwd單詞前

       sed-e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets  多次處理

       sed–i.bak ‘s/dog/cat/g’ pets


   7.保持空間及高級命令


   sed 除了“模式空間”(pattern space),還有一個“hold space”的內存空間,稱之為 保持空間

 所謂保持空間,就是,對于模式空間處理過的行,可能還有其他的處理,因此可以先把處理過的行“傳送”至保存空間,然后再后續的處理中再次“傳送”回模式空間中。 這就類似于加工車間和倉庫的概念,好比模式空間為加工車間,保持空間為倉庫,不過這里的倉庫存放的都是些半成品的產品。


   高級編輯命令

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

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

       g: 從保持空間取出數據覆蓋至模式空間

       G:從保持空間取出內容追加至模式空間

       x: 把模式空間中的內容與保持空間中的內容進行互換

       n: 讀取匹配到的行的下一行覆蓋至模式空間

       N:追加匹配到的行的下一行至模式空間

       d: 刪除模式空間中的行

      D:刪除當前模式空間開端至\n的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed


示例:

       sed -n 'n;p' FILE

         sed '1!G;h;$!d' FILE

         sed '$!N;$!D' FILE

         sed '$!d' FILE

         sed ‘G’ FILE

         sed ‘g’ FILE

         sed ‘/^$/d;G’ FILE

         sed 'n;d' FILE

         sed -n '1!G;h;$p' FILE




  練習:

    1、刪除/etc/grub2.cfg文件中所有以空白開頭的行行首的空白字符

wKioL1eqx0yziwkdAAAfS_I_d_g091.png

   2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符

wKioL1eqx3OgZMS-AAATRpXLiBw961.png

   3、在/root/install.log每一行行首增加#號

wKiom1eqx4OgFHNsAAAgjqLpKQk456.png

   4、在/etc/fstab文件中不以#開頭的行的行首增加#號

wKioL1eqx5_j1lbIAABNXtVlwpk787.png

    5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名

wKiom1eqx9ijwMWNAAAftJm3pd0151.pngwKiom1eqx-zyRPFzAAAUlxDIBWI423.png

       過程分析如下

wKiom1eqyISi1TvbAAAobHaBmaI288.png

   6、利用sed 取出ifconfig命令中本機的IPv4地址

wKioL1eqyBOjncs_AAAbBFGMJCU359.png

   7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數

wKioL1eqyCLhJYU_AAAxw_VRKdU053.png

 

 

 總結與感悟:

   1.通過對sed的學習,知道了sed相對于grep的功能更加強大。

   區別:

     grep只是一個文本過濾工具,作用就是根據用戶指定的過濾條件對目標文件逐行進行匹配檢查,打印匹配到的行。

     sed是一種非交互式的文本編輯器(通過給定的條件自動逐行的去處理文件),grep只是用來檢索條件關鍵字的,而sed是搜索匹配處理文本工具,功能可以實現數據的替換、刪除、新增等,更加強大。

   2.在處理一些題目時,可以采用的思路方法:

    對目標文件利用擴展的正則表達式,進行分組處理,用組表示出所有的內容,然后把想要的內容用前面的分組替換。

    注意 .* 的靈活應用,轉義符 \ 的使用(在.和()中使用)以及匹配次數的靈活應用 \+

 


原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/32745

(0)
zhumengxiaotaozhumengxiaotao
上一篇 2016-08-10 13:59
下一篇 2016-08-10 15:33

相關推薦

  • 源碼包安裝Apache服務

    1、安裝development tools程序包組 安裝Apache服務器前需要解決依賴性問題,比如需要安裝GCC、GCC++、OPENSSL等等,因為是在虛擬機里做實驗,這里就通過直接安裝包組的方法解決依賴性問題。 (1)掛載安裝光盤,并安裝“Development tools”包組 [root@localhost ~]# mount&…

    Linux干貨 2016-08-24
  • 第四周:/etc/passwd、/etc/group文件熟悉及配合grep使用正則表達式

    1、復制/etc/skel目錄為/home/tuser1,要求/home/tuser1及其內部文件的屬組和其它用戶均沒有任何訪問權限。 [root@wlm ~]# useradd tuser1 [root@wlm ~]# cp -r etc/skel/ /home/tuser1/…

    Linux干貨 2016-10-13
  • Linux基礎學習總結(一)

    一、計算機的組成與功能 二、Linux的版本 三、Linux的哲學思想 四、Linux基礎命令(一) 五、Linux幫助信息 六、Linux目錄結構

    Linux干貨 2016-09-20
  • Java中的CopyOnWrite容器

    Copy-On-Write簡稱COW,是一種用于程序設計中的優化策略。其基本思路是,從一開始大家都在共享同一個內容,當某個人想要修改這個內容的時候,才會真正把內容Copy出去形成一個新的內容然后再改,這是一種延時懶惰策略。從JDK1.5開始Java并發包里提供了兩個使用CopyOnWrite機制實現的并發容器,它們是CopyOnWriteArrayList和…

    Linux干貨 2016-08-15
  • sed用法預習總結

    SED用法sed:Stream EDitor    行編輯器 sed:模式空間     默認不編輯原文件,僅對模式空間的數據做處理,將處理后的結果輸出至屏幕 sed [options] 'AdressCommand' file…   &n…

    Linux干貨 2016-08-10
  • keepalived的初級使用

        1、雙主模型的ipvs高可用   一、雙主模型的ipvs高可用     1)網絡結構圖       2)、ipvs的類型是dr模型,調度算法是rr       RS1和RS2都是centos6.8 對RS1和RS2的配置:…

    Linux干貨 2017-05-15
欧美性久久久久