文本三劍客之一 —— sed

前言:這一次我們主要來介紹一下文本三劍客之一的sed,並且介紹一下各種用法

一,介紹

    sed (Stream EDitor)

是一種流編輯器,一次處理一行內容,所以我們也稱之爲行編輯器。

在學習sed之前我們要先了解倆個內容

  • 模式空間

    在用sed對文本進行處理的時候,將正在處理的行儲存在一個臨時緩衝區中,這個緩衝區我們稱爲模式空間

  • 保持空間

    對於在模式空間正在處理的行還有其他處理時,暫時儲存在另一個臨時緩衝區,這個緩衝區稱爲保持空間

     功能

主要用來自動編輯一個或多個文件,簡化對文件的反覆操作,編寫轉換程序等

二,用法 

sed  選項 '地址定界  編輯命令  編輯內容'

支持正則表達

      常用選項

                               sed1.png

     地址命令

       sed2.png

     編輯命令

                             sed3.png

    查找替換

  s/// (支持使用其他分隔符,例如s@@@)

                             sed4.png



綜合舉例詳解

進入/app下拷/etc/passwd文件的一半內容,並在其中加幾行空行,內容如下

博客1.png

看例子

博客2.png

如圖所示標記先看第一個示例,sed 一般用單引號,'2p'表示在默認輸出的後面輸出第二行,文件其他內容都顯示出來是因爲sed是對行處理,沒有要求自然直接輸出,而你要輸出第二行,所以第二行輸出了倆次;想要輸出你要輸出的那行,那麼就用到了 -n ,也就是第二個示例;第三個示例則是打印了模式空間所匹配到的空行的行號,看一下之前文件的內容,是不是結果顯示的那幾行呢


接下來看一下三個用法相同的選項

博客3.png

a後面接上文本是在指定行後加文本,2指定地行,所以第二行後面有了root,a後面\這個只是起到分隔作用,可加可不加

博客4.png

i 是在指定行前面加文本,其他跟a 一樣用法

博客5.png

c 則是替換指定行,所以可以看到原本的第二行沒有了,root成爲了第二行


看一下匹配字符串的行用這三個命令是應該怎麼敲

博客1.png

匹配字符串的是/pattern/,所以是/root/表示的是可以匹配到root的行,a,i,c,都是一樣的


好,看一下其他選項的示例

1.png

首先,模式空間匹配到的是空行,d是刪除模式空間匹配的內容,所以最後輸出的結果就是沒有空行



2.png

這個也是刪除,1,10是地址界定匹配第1行到第10行,然後刪除


3.png

nl是打印除了空行的行的行號,然後刪除第二行到第五行


4.png

這個則是打印非空行的行號之後,在第二行後面增加tea,a 後面的空格則是跟之前提到的\一樣 是分隔符


5.png

替換,g是全文替換,前面是被替換的內容,後面是替換的內容,所以是將全文的test換成mytest,至於example,是文件名啊


6.png

這裏出現的&,代表的是root,跟後向引用用法相似,但不是後向引用,&代表前面所匹配的字符串



7.png

這個示例講的則是-e -e ,多項編輯,並且的關係,把文件中的dog換成cat,並且把hi換成lo,沒加地址定界和g,就只換每一行第一個匹配到的字符串;加了地址定界就是替換定界的行,加了g就是全文替換


8.png

-i.bak,在修改了文件內容,並且備份到一個以.bak結尾的文件,也就是原來的文件是修改的了,後綴是.bak的則是原文件


三,高級用法

                        sed5.png

先來看一下模式空間和保持空間的關係

博客1.png


接下來看一下具體的示例

9.png

分析一下,n是讀取匹配到行的下一行覆蓋到模式空間,也就是模式空匹配第一行,然後再讀取第二行覆蓋到模式空間,,所以就只剩第二行了,-n只輸出模式空間的內容;以此類推,所以最後就是輸出第二行第四行,也就是輸出偶數行,選項之間用;間隔,驗證一下

博客1.png

結果確實是輸出偶數行,自己敲一下就可以驗證,後面的示例就不一一驗證了


10.png

!是進行反處理,1!就是不是第一行,G將保持空間的內容追加到模式空間,h將模式空間的內容覆蓋到保持空間,$!不是最後一行,刪除;整條命令的進行過程就是這樣的,讀取第一行,是第一行不進行處理,然後模式空間是第一行,覆蓋到保持空間,不是最後一行,刪除;讀取第二行,先將保持空間內容追加到模式空間,保持空間是第一行,所以追加到模式空間的第二行後面,然後模式空間內容覆蓋到保持空間,所以現在模式空間和是第二行第一行,然後不是最後一行,所以模式空間的內容刪除,一次類推,最後輸出的就是倒序內容


11.png

N是讀取匹配的行的下一行追加到模式空間,D是刪除直到$的內容,一直到最後一行,沒有下一行,直接輸出,最後輸出的結果就是輸出最後一行


12.png

這個就是對不是最後一行的內容進行N處理,然後除了最後一行都刪除,匹配第一行時,追加第二行到模式空間,然後刪除第一行,剩下第二行;再讀第二行,模式空間是第二行第三行,刪除第一次進行處理留下的第二行,剩下第二行第三行,一次類推結果就是剩下最後兩行


14.png

15.png

這倆個放在一起說,g是覆蓋,G是追加,從保持空間到模式空間,剛開始的時候沒有其他處理保持空間沒有內容,所以就是追加或者覆蓋空白行,所以最後結果就是G是每一行下面都多了一個空行,g則是都是空行


17.png

之前有過一個例子sed -n 'n;p'是輸出偶數行,這次沒有-n 'p' ,然後又把模式空間匹配到的偶數行都刪除了,所以就剩下奇數行輸出了


總結:sed我知道的就這些了,最後再來梳理記憶一下

               bk.png


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章