手机看片精品高清国产日韩,色先锋资源综合网,国产哺乳奶水91在线播放,乱伦小说亚洲色图欧洲电影

Linux基礎之sed流編輯器詳解

2016-08-22 08:08:25 10636

sed是什么?


sed是Stream EDitor的縮寫,man中對sed的簡介為

sed - stream editor for filtering and transforming text

?的主要功能是對文本的過濾與替換。




sed的工作原理


sed的工作過程:sed是一個流編輯器,所謂流編輯器是指sed每次只從文件或stdin中讀入一行,將讀入的行保存至模式空間然后根據(jù)指定的要求對其進行處理,并將處理后的結果輸出至屏幕,接著讀入下一行,整個文本的過程如流水線般被逐行處理后輸出。


sed對內(nèi)容的處理方式:sed不是在原文件中或原輸入上直接進行處理的,它將讀入的行放入緩存區(qū),對緩存區(qū)里的內(nèi)容進行處理,處理完畢后默認不會寫入或覆蓋源文件,而是直接輸出到屏幕上。


它有兩個內(nèi)存緩沖區(qū)分別叫做:模式空間(pattern space)、保持空間也有稱作暫存緩存區(qū)(holding space)。


一般情況下sed首先把第一行裝入模式空間,進行處理后輸出屏幕,然后第二行裝入模式空間替換掉模式空間里原來的內(nèi)容,再進行處理,依次循環(huán),直至結束。


下面是我對sed工作流程的理解圖。

wKioL1eq4ubyORJ9AAC2GrRqMkw154.jpg

1、sed每次將stdin中的內(nèi)容中的一行讀入模式空間

2、之后根據(jù)模式空間中的匹配條件進行匹配,符合條件進入下一階段即普通編輯,不滿足則默認至標準輸出,結束

3、普通編輯之后分三個階段,1)普通編輯之后選擇性顯示至STDOUT,結束;2)進入holding space進行高級編輯,編輯結束后選擇性顯示至模式空間,之后再次根據(jù)編輯命令重復2-3過程;3)若是出現(xiàn)多編輯命令則需要再返回模式空間根據(jù)編輯條件再次進行2-3步驟。

限于個人理解程度上述的理解免不了跟真實的工作流程有些出入,大家要抱著質疑的態(tài)度去看,我寫的不一定都是對的,不過錯的應該不至于很多。




sed語法

sed OPTIONS... <SCRIPT> [INPUTFILE...]

[SCRIPT]:可以理解為地址定界加編輯命令。

常用選項

         -n:不輸出模式空間中的內(nèi)容至屏幕;通俗點可以理解為它可以自動過濾掉模式空間中未匹配到的行,-n 要與命令編輯中的p合用(命令編輯?下文),用于顯示模式空間中被匹配到的內(nèi)容。

            suppress automatic printing of pattern space

         -n的具體應用見后面的sed編輯高級命令演示

         -e:多點編輯

            add the script to the commands to be executed

         -f:每行一個編輯命令

            add the contents of script-file to the commands to be executed

         -r:使用擴展表達式

            use extended regular expressions in the script.

         -i:直接編輯原文件

         edit files in place (makes backup if SUFFIX supplied)


SCRIPT

之前對這塊很迷糊,因為info中sed顯示語法有[]表示可加可不加,于是就在sed后直接加想要編輯的文本

于是就出現(xiàn)如下情況

1
2
[root@localhost test]# sed sed1
sed:-e 表達式 #1,字符 4:未終止的“s”?令

報錯信息沒找到終止的限制條件,所以上面的sed語法格式并不準確。

通過實驗,sed可以不加[OPTION]但是[SCRIPT]則必須添加

SCRIPT分兩部分地址定界(用于限定編輯文本的范圍)、編輯命令(用于對匹配到的內(nèi)容進行什么樣的操作或編輯),前者可少后者必不可少,如果沒有編輯的命令會發(fā)生如下錯誤

1
2
3
4
5
6
7
8
9
10
[root@localhost test]# sed '1' cat1
sed:-e 表達式 #1,字符 1:遺漏命令
[root@localhost test]# cat cat1
hi,everyone
now I will show how to use cat
[root@localhost test]# sed 'p' cat1
hi,everyone
hi,everyone
now I will show how to use cat
now I will show how to use cat

地址定界

        1、空地址:對全文處理

        2、單地址:

          #:指定行;

          /pattern/:被此模式所匹配到的每一行;

        3、地址范圍:

         #,#:從#開始到#結束的所有行

         #,+#:從#開始向下至+#的行之間的所有行

         #,/pat1/ 從#開始至匹配到第一次出現(xiàn)/pat1/模式的行之間的所有行

         /pat1/,/pat2/:第一次匹配到/pat1/的行到第一次匹配到/pat2/的行之間的所有行

        4、步進:~

        1~2:所有奇數(shù)行          2~2:所有偶數(shù)行


編輯命令:若少了編輯命令會報錯,編輯命令在SCRIPT中至少出現(xiàn)一次。


        d:刪除模式空間中匹配到的內(nèi)容       delete pattern space

        a ext 在行后面插入文本“text”,支持使用 實現(xiàn)多行插入

        Append text, which has each embedded newline  preceded  by  a  back slash.

        i ext 在行前面插入文本“text”,支持使用 實現(xiàn)多行插入

        Insert  text,  which  has  each embedded newline preceded by a back slash.

        c  ext 把匹配到的行替換為此處指定的文本“text”

       replace the selected lines with text, which has each  embedded  new line preceded by a backslash.

        w filename 保存模式空間匹配的行至指定的文件中

              Write the current pattern space to filename.

        r filename 讀取指定文件內(nèi)容至當前文件被模式匹配到的行文件后合并

              Append text read from filename.

        =  : 為模式匹配到的行打印行號    Print the current line number.

        !: 條件取反(它比較特殊,它必須跟其他編輯命令一起使用

      s/regexp/replacement/ : 查找替換,其分隔符可自行指定,常用有s@@@,s###

      它有一個特殊的用法s//x&/:表示將被查找的內(nèi)容在其前面添加x內(nèi)容

                        s//&x/:表示將被查找的內(nèi)容在其后面添加x內(nèi)容

                        &代表被查找的內(nèi)容

1
2
3
4
5
6
7
8
9
[root@localhost test]# cat cat1
hi,everyone
now I will show how to use cat
[root@localhost test]# sed 's/e/&#/' cat1  
hi,e#veryone
now I will show how to use# cat
[root@localhost test]# sed 's/e/#&/' cat1 
hi,#everyone
now I will show how to us#e cat

                    p  :顯示替換成功的行    

                    g  :全局替換

                    w  filename : 將替換成功的結果保存至指定文件中

      查找替換在sed中應用很廣,下面很多例子都是以sed的替換功能實現(xiàn)的

         :顯示當前模式空間中的內(nèi)容    Print the current pattern space.


注:同時使用多個編輯命令,命令之間要用;隔開(!除外)

例子如下:

1
2
3
4
5
6
7
[root@localhost test]# sed 'p;=' cat1
hi,everyone
1
hi,everyone
now I will show how to use cat
2
now I will show how to use cat




實例演示

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

1
sed 's#^[[:space:]]+##' /etc/grub2.cfg

這里##是將前面匹配到的內(nèi)容刪除的意思,上面文本內(nèi)容太多,就不截取了。

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

1
sed 's@^#[[:space:]]+@@' /etc/fstab

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        [root@localhost test]# cat /etc/fstab 
        #
        # /etc/fstab
        # Created by anaconda on Tue Jul 19 23:52:41 2016

        提交成功!非常感謝您的反饋,我們會繼續(xù)努力做到更好!

        這條文檔是否有幫助解決問題?

        非常抱歉未能幫助到您。為了給您提供更好的服務,我們很需要您進一步的反饋信息:

        在文檔使用中是否遇到以下問題: