sed之高級命令的解析

            sed工作機制中另一個邏輯空間用于作為模式空間的好幫手,就是叫保持空間(hold space),在模式空間中處理一行內容會繼續處理下一行,那么對于處理過的行可能還有其他處理,因此可以先把處理好的數據存放在hold space 中,然后等到全部處理好之后在回到模式空間中。簡單的可以說是用于和模式空間配合使用交換空間里的數據達到想要的結果

其中一般用到hold space的稱作高級編輯命令:

高級編輯命令:

h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:把保持空間中的內容覆蓋至模式空間中
G:把保持空間中的內容追加至模式空間中
n:覆蓋讀取匹配到的行的下一行至模式空間中
N:追加讀取匹配到的行的下一行至模式空間中
d:刪除模式空間中的行
D:刪除多行模式空間中的首行
x:把模式空間中的內容與保持空間中的內容替換

 高級命令示例解析: 

 1.sed -n ‘n;p‘ file  顯示文件中偶數行(即2、4、6、8……行)

-n:不打印默認打印到屏幕上的所有行(靜默模式)

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

p:打印符合pattern psace的行

    [root@localhost ~]# cat SED.txt | tr -d '\n'
    12345678910    //這里我把換行刪除為節約空間便于觀察
    [root@localhost ~]# sed -n 'n;p' SED.txt 
      2
      4
      6
      8
      10

        解析:

            當sed讀取文件中的第一行,來到執行“n”命令,而“n”命令的作用是讀取匹配到的下一行到模式空間,也就是說我們現在模式空間中的是第一行,而“n”命令需要我們去讀它的下一行,也就是把第二行讀到模式空間,把第一行覆蓋了,而后又執行“p”命令,則是打印出pattern space 中的行,即打印第2行,由于我們使用“ -n ” 選項默認不打印pattern space 讀過的內容,而“p”命令是打印pattern space 符合條件的,所以打印第二行;

   接著讀取第三行,因為第二行在讀取第一行的時候已經被命令調用去讀取第二行。so讀取第三行,然后執行“n”命令,又去讀取第4行,從而覆蓋掉了第三行,然后打印第4行;………sed命令就這么一直執行下去,符合條件輸出的都是雙數行 。輸出的也就是偶數行

2.sed ’1!G;h;$!d' file 逆序顯示文件

        G:把保持空間中的內容追加至模式空間中        
        h:把模式空間中的內容覆蓋至保持空間中
        d:刪除行
        $:  最后一行
        ?。喝》?
        (1!G):除了第一行,其他都要執行G命令
        ($!d):除了最后一行,其他都有要執行“d”(刪除)命令
    [root@localhost ~]# sed  '1!G;h;$!d' SED.txt 
        10
        9
        8
        7
        6
        5
        4
        3
        2
        1

    解析:

        讀取文件第一行,判斷是不是第一行,如果是就不執行G命令,如果不是,就執行G命令,現在讀取的是第一行,所以不執行G命令,然后來到執行第二個命令(h),現在模式空間中的是第一行,則把第一行復制覆蓋到保持空間中,然后在執行下一個命令,判斷模式空間中的是不是最后一行,如果是,就不刪除,否則刪除,現在模式空間中的是第一行,所以刪除,保持空間中的內容不變;

接著讀取第二行,判斷出不是第一行,則執行“G”命令,把保持空間中原有的第一行追加讀取到模式空間中(現在模式空間中的順序為2在前1在后,因為是追加上去的),然后執行“h”命令,把模式空間中的行復制覆蓋到保持空間中,因此現在保持空間中的順序為第二行在前,第一行在后,然后判斷是否為最后一行時,模式空間中的第二行和第一行則被刪除掉; 

再接著讀取第三行,在依次進行判斷,得到最后的結果就是倒序顯示文件中的行。(繞了那么多,其實就是tac命令解決,這只是為了理解其含義)

  

  3.sed '$!d' file 取出文件最后一行

        $:最后一行        
        d:刪除行
        [root@localhost ~]# sed '$!d' SED.txt 
        10

     解析:

        讀取第一行到模式空間中,第一個命令判斷是否為最后一行,如果是,則不刪除,否則刪除,由此可知,只有最后一行不刪除,其他全刪除,就留下最后一行。則取出文件最后一行。

    4.sed ‘$!N;$!D' file  取出文件 最后兩行2

    N:追加讀取匹配到的行的下一行至模式空間中    
    D:刪除多行模式空間中的首行
    $:最后一行
  [root@localhost ~]# sed '$!N;$!D' SED.txt 
    9
    10

     解析:

        讀取第一行,然后執行第一個命令,(如果不是最后一行則追加讀取匹配到的當前行的下一行到模式空間中,)此時是第一行,然后執行"N"命令,把當前行的下一行追加讀取到當前的模式空間中,此時模式空間中為12兩行,然后再執行后面的命令(如果不是最后一行,則刪除當前多行中的首行,即刪除第一行,)此時模式空間中還剩下第二行(暫時保存在保持空間中,雖然沒有命令說要將行放到保持空間中,保持空間如果沒有命令指定用,則會用來保存模式空間處理過的行,以便模式空間之后需要使用);

則又去讀取第三行,然后判斷不是最后一行, 則追加當前的第三行的下一行(第四行)到模式空間中,(此時模式空間中加上原有剩下的第二行,為2和4行,)然后再判斷不是最后一行,則刪除當前模式空間中的第一行,留下第四行。

則繼續讀取第五行,此時為最后一行,然后第一個命令不執行“N”命令,再接著不執行D命令,即現在模式空間中的所剩下的行為第4行和第5行,然后打印模式空間的行出來即為文件的最后兩行。

    5.sed ‘/^$/d;G file  刪除原文件中的空白行,再添加空行到每一行的下面

這比較簡單,大伙試著自己分析吧,只要把高級命令各個所代表含義記熟這都不是事。(我也留幾個以后看的忘了好繼續分析理解)

    6.sed ’n;d' file 顯示奇數行

這和第一題恰好相反

    7.sed 'G' file  在原文件中的每一行添加空行,包括原有的空白行后面也添加空白行

這更不用解釋了

加油,付出就一定會有收獲的?。?!

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

(1)
LiiLii
上一篇 2016-08-08 22:23
下一篇 2016-08-09 01:31

相關推薦

  • 計算機基礎入門及Pyhton基礎

    編程基礎 計算機基礎 程序(program識別并執行的指令 計算機是執行程序的機器 現代計算機 艾倫·麥席森·圖靈奠定了現在計算機的邏輯工作方式的基礎 馮·諾依曼提出計算機應該有五大部件組成:輸入/輸出設備、運算器、控制器、輸出設備。這是現代計算機基本框架。 語言基礎 計算機語言:與計算機之間交互的語言 機器語言:一定位數的二進制代碼成為機器指令,指令集合則…

    2017-09-16
  • old notes

    yum update: update software guest edition ***: how to install guest edition: 1) need to root: su – 2) yum install kernel-devel 3)yum install gcc* ( when don't remember n…

    Linux干貨 2016-09-19
  • shell編程的常見實例

    1. 寫一個腳本/root/bin/argsnum.sh 用戶輸入一個文件路徑并查找文件中空白行的個數 ,如果用戶沒有輸入路徑則自動退出  實驗結果如下: 如果不輸入任何路徑程序會自動退出:實驗結果如下: 用其他方法驗證是不是有兩行空行: (個人總結): 1.   read 命令,如果用 -p 來做提示信息,則不支持\n換行,這…

    Linux干貨 2016-08-12
  • NFS,samba,vsftpd的基本使用

    一.NFS介紹 NFS(Network File System),全名叫做網絡文件系統,是由SUN公司研發的。顧名思義,簡單理解就是通過網絡互聯,將本地的文件系統共享出去,從而實現資源的共享,NFS監聽在TCP的2049端口上。當涉及到主機之間的通信時,就會存在安全問題,于是為了安全考慮,主動提出請求的一方(客戶端)需要提供一些基本信息來認證,這些信息是需要…

    Linux干貨 2017-01-04
  • LNAMP 跨網段實現

    感謝Kason老師給我了知識!

    2017-12-31
  • Linux 終端類型

      1、 什么是終端     終端就是用戶與主機進行交互的一種介質(方式),可以是虛擬的,也可以是實體的。   2、 終端種類       (1)控制臺終端(/dev/console):在Linux系統中,計算機顯示器通常被稱為控制臺終端。Console與虛擬終端相關聯…

    Linux干貨 2016-10-19
欧美性久久久久