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

Linux基礎之sed流編輯器詳解

2016-08-22 08:08:25 10633

sed是什么?


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

sed - stream editor for filtering and transforming text

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




sed的工作原理


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


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


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


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


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

wKioL1eq4ubyORJ9AAC2GrRqMkw154.jpg

1、sed每次將stdin中的內容中的一行讀入模式空間

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

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

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




sed語法

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

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

常用選項

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

            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后直接加想要編輯的文本

于是就出現如下情況

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

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

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

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

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/ 從#開始至匹配到第一次出現/pat1/模式的行之間的所有行

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

        4、步進:~

        1~2:所有奇數行          2~2:所有偶數行


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


        d:刪除模式空間中匹配到的內容       delete pattern space

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

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

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

        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 讀取指定文件內容至當前文件被模式匹配到的行文件后合并

              Append text read from filename.

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

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

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

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

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

                        &代表被查找的內容

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的替換功能實現的

         :顯示當前模式空間中的內容    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

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

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

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

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

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

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