sed命令:
Stream EDitor, 行編輯器
sed是一種流編輯器,它是文本處理中非常中的工具,能夠完美的配合正則表達式使用,功能不同凡響。處理時,把當前處理的行存儲在臨時緩沖區中,稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒有改變,除非你使用重定向存儲輸出。sed主要用來自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。
語法:sed [options] ….. ‘script’ [input-file]
script:地址定界編輯命令
常用選項:
-n: | 不輸出模式空間中的內容的制動打印 |
-e: | 多點編輯 |
-f /PATH/TO/SED_SCRIPT_FILE: | 從指定文件中讀取編輯腳本,每行一個編輯命令; |
-r : | 支持使用擴張正則表達式 |
-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文件中所 有以空白開頭的行行首的空白字符
[root@centos7 ~]# sed 's/^[[:space:]]\+//g' /etc/grub2.cfg
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
[root@centos7 ~]# sed 's/^#[[:space:]]\+//g' /etc/fstab
3、在/root/install.log每一行行首增加#號
[root@localhost ~]# sed 's/^/#/g' install.log
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
[root@centos7 ~]# sed -e 's/^[^#]/#&/g' -e 's/^$/#/' /etc/fstab
sed命令中有兩個空間,前面已經提到模式空間(pattern word),還有一個叫做保持空間(hold space)。在模式空間編輯后的文本都可以放置在保持空間中。保持空間與模式空間的內容可以互相交換,極大的提高使用靈活度。使用保持空間就需要用到高級的編輯命令了:
高級編輯命令:
h: | 把模式空間中的內容覆蓋至保持空間中; |
H: | 把模式空間中的內容追加至保持空間中; |
g: | 把保持空間中的內容覆蓋至模式空間中; |
G: | 把保持空間中的內容追加至模式空間中; |
x: | 把模式空間中的內容與保持 空間中的內容互換 |
n: | 覆蓋讀取匹配到的行的下一行至模式空間中; |
N: | 追加讀取匹配到的行的下一行至模式空間中 |
d: | 刪除模式空間中的行; |
D : | 刪除多行模式空間中的所有行; |
示例:
1、sed -n 'n;p' FILE
解析:編輯命令分為兩個部分:
①-n:不輸出模式空間中的自動打印內容
②編輯命令中:n: 將讀取到的行的下一行覆蓋至模式空間,
即:開始讀取第一行時將第二行一并讀取,在模式空間中第二行將第一行覆蓋,即模式空間中現在只有第二行文件。然后p打印模式空間中的行。然后再讀取文件中的第三,四行文件。模式空間中第四行將第三行覆蓋,隨后p打印出第四行,一次類推直至最后一行。所輸出的結果即為第二、四、六……等偶數行。
結果:顯示偶數行
2、sed '1!G;h;$!d' FILE
解析:編輯命令分為三個部分:
①:1!G :不是第一行就執行G選項,及將保持空間內的內容追加至模式空間中。
②:h:將模式空間內的內容覆蓋至保持空間
③:$!d:不是最后一行就刪除
首先命令讀取文件中第一行內容,①不執行,②執行將模式空間內的內容覆蓋至保持空間,即模式空間現為第一行內容,保持空間為第一行內容。③執行,模式空間為空,保持空間為第一行。
然后讀取第二行內容,①執行,模式空間為第二行,第一行。保持空間不變。② 執行,保持空間改變為第二行,第一行。③執行,模式空間變為空。
以此類推,命令讀取至最后一行時,①模式空間為最后一行,倒數第二行,……②執行,保持空間同模式空間一樣逆序排列。③不執行。
結果:逆序顯示文件的內容
3、sed '$!N;$!D' file
解析:編輯命令分為兩個部分:
①$!N:不是最后一行就將追加讀取匹配到的行的下一行至模式空間中。
②$!D : 不是最后一行就刪除多行模式空間中的所有行。
首先讀取文件第一行,①執行,模式空間為第一行,第二行。②執行,模式空間為空。
以此類推,讀取至文件倒數第二行,①執行,模式空間為倒數第二行,倒數第一行。②不執行。
結果:取出文件最后兩行。
4、sed '/^$/d;G' FILE:
解析:編輯命令分為兩個部分:
①/^$/d:匹配到空白行就刪除。
②G:將保持空間中的行追加至模式空間中。
①執行,命令匹配到文件中的空白行,然后刪除。②執行,保持空間為空,將空白行追加至模式空間行后。
結果:把文件中原有的空白行刪除,而后為所有的非空白行后臺添加空白行
5、sed 'n,d' FILE
解析:編輯命令分為兩個部分;
①:n: 覆蓋讀取匹配到的行的下一行至模式空間中
②:d:刪除
首先,命令讀取文件第一行,①執行,模式空間中為第二行,②執行,模式空間為空。命令未加-n選項,輸出模式空間自動打印,即輸出第一行,
以此類推,輸出模式空間內容的自動答應,即為第一、三、五……行
結果:顯示奇數行
原創文章,作者:Groot,如若轉載,請注明出處:http://www.www58058.com/32355