標籤: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命令詳解