国产欧美日韩第一页|日本一二三不卡视频|在线精品小视频,亚洲第一免费播放区,metcn人体亚洲一区,亚洲精品午夜视频

Linux基礎(chǔ)之sed流編輯器詳解

2016-08-22 08:08:25 11684

sed是什么?


sed是Stream EDitor的縮寫(xiě),man中對(duì)sed的簡(jiǎn)介為

sed - stream editor for filtering and transforming text

?的主要功能是對(duì)文本的過(guò)濾與替換。




sed的工作原理


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


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


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


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


下面是我對(duì)sed工作流程的理解圖。

wKioL1eq4ubyORJ9AAC2GrRqMkw154.jpg

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

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

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

限于個(gè)人理解程度上述的理解免不了跟真實(shí)的工作流程有些出入,大家要抱著質(zhì)疑的態(tài)度去看,我寫(xiě)的不一定都是對(duì)的,不過(guò)錯(cuò)的應(yīng)該不至于很多。




sed語(yǔ)法

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

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

常用選項(xiàng)

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

            suppress automatic printing of pattern space

         -n的具體應(yīng)用見(jiàn)后面的sed編輯高級(jí)命令演示

         -e:多點(diǎn)編輯

            add the script to the commands to be executed

         -f:每行一個(gè)編輯命令

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

         -r:使用擴(kuò)展表達(dá)式

            use extended regular expressions in the script.

         -i:直接編輯原文件

         edit files in place (makes backup if SUFFIX supplied)


SCRIPT

之前對(duì)這塊很迷糊,因?yàn)閕nfo中sed顯示語(yǔ)法有[]表示可加可不加,于是就在sed后直接加想要編輯的文本

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

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

報(bào)錯(cuò)信息沒(méi)找到終止的限制條件,所以上面的sed語(yǔ)法格式并不準(zhǔn)確。

通過(guò)實(shí)驗(yàn),sed可以不加[OPTION]但是[SCRIPT]則必須添加

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

1
2
3
4
5
6
7
8
9
10
[root@localhost test]# sed '1' cat1
sed:-e 表達(dá)式 #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、空地址:對(duì)全文處理。

        2、單地址:

          #:指定行;

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

        3、地址范圍:

         #,#:從#開(kāi)始到#結(jié)束的所有行

         #,+#:從#開(kāi)始向下至+#的行之間的所有行

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

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

        4、步進(jìn):~

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


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


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

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

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

        i ext 在行前面插入文本“text”,支持使用 實(shí)現(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)容至當(dāng)前文件被模式匹配到的行文件后合并

              Append text read from filename.

        =  : 為模式匹配到的行打印行號(hào)    Print the current line number.

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

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

      它有一個(gè)特殊的用法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 : 將替換成功的結(jié)果保存至指定文件中

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

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


注:同時(shí)使用多個(gè)編輯命令,命令之間要用;隔開(kāi)(!除外)

例子如下:

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




實(shí)例演示

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

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

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

2、刪除/etc/fstab文件中所有以#開(kāi)頭,后面至少跟一個(gè)空白字符的行的行首的#號(hào)及#后面的所有空白字符

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

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

這條文檔是否有幫助解決問(wèn)題?

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

在文檔使用中是否遇到以下問(wèn)題: