sed命令詳解

來源:互聯網
上載者:User

標籤:sed命令   linux行編輯器   

sed命令:

 Stream EDitor, 行編輯器

 sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合Regex使用,功能不同凡響。處理時,把當前處理的行儲存在臨時緩衝區中,稱為“模式空間”(pattern space),接著用sed命令處理緩衝區中的內容,處理完成後,把緩衝區的內容送往螢幕。接著處理下一行,這樣不斷重複,直到檔案末尾。檔案內容並沒有改變,除非你使用重新導向儲存輸出。sed主要用來自動編輯一個或多個檔案;簡化對檔案的反覆操作;編寫轉換程式等。

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/85/9C/wKioL1ep46nzQ9qsAAB2Wf-5zkg405.png" title="10.png" alt="wKioL1ep46nzQ9qsAAB2Wf-5zkg405.png" />

文法:sed [options] ..... ‘script’ [input-file]

    script:地址定界編輯命令

常用選項:

-n: 不輸出模式空間中的內容的制動列印
-e:   多點編輯
-f /PATH/TO/SED_SCRIPT_FILE:  從指定檔案中讀取編輯指令碼,每行一個編輯命令;
-r : 支援使用擴張Regex
-i : 直接編輯原檔案    

地址界定:

1、不給地址:對全文進行處理;

2、單地址:

    #:指定的第#行

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

3、位址範圍:

    #,#:   從第#行到第#行

    #,+# :  從第#行到第#+#

    #,/pat1/: 從第#行道匹配到第一次匹配到pat1,之間的行

    $:最後一行

4、步進:~

    1~2:所有奇數行

    2~2:所有偶數行

編輯命令:

-d:  刪除
-p: 顯示模式空間內容
a \text:  在行的後面追加文本,支援使用\n實現多行追加
i \text : 在行的後面追加文本,支援使用\n實現多行追加
c \text :  把匹配到的行替換為此處指定的文本
w /PATH/TO/SOMEFILE : 儲存模式空間匹配到的行至指定的檔案中
r /PATH/TO/SOMEFILE :  讀取指定檔案中的內容至當前檔案被模式比對到的行後面,檔案合并。
= : 為模式比對到到的行列印行號
!: 條件取反
s///: 尋找替換,其分割符可自行指定。如:@@@,###
        替換標記:

g:全域替換

w /PATH/TO/SOMEFILE  : 將替換成功的結果儲存至指定檔案中;

p:顯示替換成功的行

  

 


sed元字元:

^  匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$  匹配行結束,如:/sed$/匹配所有以sed結尾的行。
.  匹配一個非分行符號的任一字元,如:/s.d/匹配s後接一個任一字元,最後是d。
*  匹配0個或多個字元,如:/*sed/匹配所有模板是一個或多個字元後緊跟sed的行。
[]  匹配一個指定範圍內的字元,如/[ss]ed/匹配sed和Sed。
[^] 

匹配一個不在指定範圍內的字元,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一個字母開頭,緊跟ed的行

\(..\) 匹配子串,儲存匹配的字元,如s/\(love\)able/\1rs,loveable被替換成lovers。
&  儲存搜尋字元用來替換其他字元,如s/love/**&**/,love這成**love**。
\<  匹配單詞的開始,如:/\<love/匹配包含以love開頭的行 
\> 匹配單詞的結束,如/love\>/匹配包含以love結尾的單詞的行。
x\{m\} 重複字元x,m次,如:/0\{5\}/匹配包含5個0的行。
x\{m,\} 重複字元x,至少m次,如:/0\{5,\}/匹配至少有5個0的行。
x\{m,n\}  重複字元x,至少m次,不多於n次,如:/0\{5,10\}/匹配5~10個0的行。


樣本:

1、刪除/etc/grub2.conf檔案中所 有以空白開頭的行行首的空白字元

[[email protected] ~]# sed   ‘s/^[[:space:]]\+//g‘  /etc/grub2.cfg

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/85/9C/wKiom1ep2VSSeIDFAAAhPqLm-jA614.png" title="1.png" alt="wKiom1ep2VSSeIDFAAAhPqLm-jA614.png" />

2、刪除/etc/fstab檔案中所有以#開頭,後面至少跟一個空白字元的行的行首的#和空白字元

[[email protected] ~]# sed ‘s/^#[[:space:]]\+//g‘ /etc/fstab

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/85/9B/wKioL1ep2j2xhacKAAAcT-uyPv0800.png" title="2.png" alt="wKioL1ep2j2xhacKAAAcT-uyPv0800.png" />

3、在/root/install.log每一行行首增加#號

[[email protected] ~]# sed ‘s/^/#/g‘ install.log

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M00/85/9B/wKioL1ep2qDSFWCgAAA34LK8UHo681.png" title="3.png" alt="wKioL1ep2qDSFWCgAAA34LK8UHo681.png" />

4、在/etc/fstab檔案中不以#開頭的行的行首增加#號

[[email protected] ~]# sed -e ‘s/^[^#]/#&/g‘ -e ‘s/^$/#/‘ /etc/fstab

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/85/9C/wKiom1ep2snRtfaNAAAkySh5d8A515.png" title="4.png" alt="wKiom1ep2snRtfaNAAAkySh5d8A515.png" />

  

    sed命令中有兩個空間,前面已經提到模式空間(pattern word),還有一個叫做保持空間(hold space)。在模式空間編輯後的文本都可以放置在保持空間中。保持空間與模式空間的內容可以互相交換,極大的提高使用靈活度。使用保持空間就需要用到進階的編輯命令了:


進階編輯命令:

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


樣本:

1、sed -n ‘n;p‘ FILE

解析:編輯命令分為兩個部分:

①-n:不輸出模式空間中的自動列印內容

②編輯命令中:n: 將讀取到的行的下一行覆蓋至模式空間,

    即:開始讀取第一行時將第二行一併讀取,在模式空間中第二行將第一行覆蓋,即模式空間中現在只有第二行檔案。然後p列印模式空間中的行。然後再讀取檔案中的第三,四行檔案。模式空間中第四行將第三行覆蓋,隨後p列印出第四行,一次類推直至最後一行。所輸出的結果即為第二、四、六……等偶數行。

結果:顯示偶數行

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/85/9C/wKiom1ep2xGh-oKqAAARqwAaQ1Y530.png" title="5.png" alt="wKiom1ep2xGh-oKqAAARqwAaQ1Y530.png" />

2、sed ‘1!G;h;$!d‘ FILE

解析:編輯命令分為三個部分:

①:1!G :不是第一行就執行G選項,及將保持空間內的內容追加至模式空間中。

②:h:將模式空間內的內容覆蓋至保持空間

③:$!d:不是最後一行就刪除

  首先命令讀取檔案中第一行內容,①不執行,②執行將模式空間內的內容覆蓋至保持空間,即模式空間現為第一行內容,保持空間為第一行內容。③執行,模式空間為空白,保持空間為第一行。

  然後讀取第二行內容,①執行,模式空間為第二行,第一行。保持空間不變。② 執行,保持空間改變為第二行,第一行。③執行,模式空間變為空白。

  以此類推,命令讀取至最後一行時,①模式空間為最後一行,倒數第二行,……②執行,保持空間同模式空間一樣逆序排列。③不執行。

結果:逆序顯示檔案的內容

650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/85/9C/wKiom1ep2zChBzIPAAAMB9ZbF3Y837.png" title="6.png" alt="wKiom1ep2zChBzIPAAAMB9ZbF3Y837.png" />

3、sed ‘$!N;$!D‘ file 

解析:編輯命令分為兩個部分:

①$!N:不是最後一行就將追加讀取匹配到的行的下一行至模式空間中。

②$!D : 不是最後一行就刪除多行模式空間中的所有行。

  首先讀取檔案第一行,①執行,模式空間為第一行,第二行。②執行,模式空間為空白。

以此類推,讀取至檔案倒數第二行,①執行,模式空間為倒數第二行,倒數第一行。②不執行。

結果:取出檔案最後兩行。

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/85/9C/wKiom1ep20rDfPbYAAAGQ1AJ0LM191.png" title="7.png" alt="wKiom1ep20rDfPbYAAAGQ1AJ0LM191.png" />

4、sed ‘/^$/d;G‘ FILE:

解析:編輯命令分為兩個部分:

①/^$/d:匹配到空白行就刪除。

②G:將保持空間中的行追加至模式空間中。

①執行,命令匹配到檔案中的空白行,然後刪除。②執行,保持空間為空白,將空白行追加至模式空間行後。

結果:把檔案中原有的空白行刪除,而後為所有的非空白行後台添加空白行

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/85/9B/wKioL1ep22aAoreDAAAazXWtIK8248.png" title="8.png" alt="wKioL1ep22aAoreDAAAazXWtIK8248.png" />

5、sed ‘n,d‘ FILE

解析:編輯命令分為兩個部分;

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

②:d:刪除

 首先,命令讀取檔案第一行,①執行,模式空間中為第二行,②執行,模式空間為空白。命令未加-n選項,輸出模式空間自動列印,即輸出第一行,

 以此類推,輸出模式空間內容的自動答應,即為第一、三、五……行

結果:顯示奇數行

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/85/9C/wKiom1ep24Cx5TxSAAAIgmCjL1U596.png" title="9.png" alt="wKiom1ep24Cx5TxSAAAIgmCjL1U596.png" />

本文出自 “I'm Groot” 部落格,請務必保留此出處http://groot.blog.51cto.com/11448219/1836313

sed命令詳解

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.