sed
sed:Stream EDitor,行編輯器
sed是一種流編輯器,它一次處理一行內容,處理時,把當前處理的行存儲在臨時緩沖區中,
稱為“模式空間”(pattern space),接著用sed命令處理緩沖區中的內容,處理完成后,
把緩沖區的內容送往屏幕。接著處理下一行,這樣不斷重復,直到文件末尾。文件內容并沒
有改變,除非你使用重定向存儲輸出。
sed主要用來自動編輯一個或多個文件,簡化對文件的反復操作,編寫轉換程序等
選項:
-n:不輸出模式空間中的內容至屏幕;理解為僅顯示處理過的結果,禁用默認輸出
-e:多點編輯
-f /path/to/script_file:從指定文件中讀取編輯腳本
-r:支持使用正則表達式
-i:直接編輯原文件
sed使用格式為地址命令
地址定界:
-
不給定任何地址或空地址,對全文進行處理
-
單地址;
#:指定地#行
pattern:被此模式模式所匹配的每一行
3.地址范圍:
#,#:起始行到結束行
#,+#:例如3,+8==>從第3行開始,向下8行,包含第3行,共計9行
#,/pattern/:從第#行開始,到第一次能夠被模式匹配的行結束
/pattern1/,/pattern2/:從第一次能夠被模式1匹配的行開始,到第一個能夠被模式2所匹配的行結束
/是固定的模式符號,必須要帶
4.~:步進
1~2奇數行
2~2:偶數行
編輯命令:
d:刪除模式空間匹配的行
p:顯示模式空間中的內容
a\text:在行后面追加文本text;支持使用\n實現多行追加
i\text:在行前面插入文件text;支持使用\n實現多行插入
c\text:替換為點行或多行文本
w /path/to/somefile:保存模式匹配的行至指定文件
r /path/form/somefile :讀取指定文件的文本至模式空間匹配的行后
=:為模式空間中的行打印行號
?。耗J娇臻g中匹配行取反處理,條件取反, (取反!要放在命令之前)例如“!d”
地址定界!編輯命令==>!位置
命令應用實例操作
[root@localhost ~]# cat test 1 2 3 4 5 6 7 8 9 10 [root@localhost ~]# sed '1,5d' test 6 7 ===>1,5為地址表示從第一行到第五行,d命令是刪除匹配的行 8 所以,結果是只顯示文件的6到10行 9 10 [root@localhost ~]#
[root@localhost ~]# sed '1,5p' test 1 1 ===>因為模式空間中的內容默認會顯示,p命令顯示模式空間匹配的內容 2 模式空間匹配的是1至5行,默認會顯示1至10行,所以最終顯示如下結果 3 3 4 4 5 5 6 7 8 9 10 [root@localhost ~]# sed -n '1,5p' test 1 2 ===>-n選項不輸出模式空間中的內容至屏幕,相當于禁用了默認顯示的功能, 3 所以只顯示了p命令匹配的1至5行 4 5 [root@localhost ~]#
[root@localhost ~]# sed '1 a\newline' file ==>在第一行后面追加文本newline 1 newline 2 3 4 5 [root@localhost ~]# sed '1 i\newline' file ==>在第一行前面插入文本newline newline 1 2 3 4 5 [root@localhost ~]# sed '1 c\newline' file ==>第一行替換為文本newline 2 3 4 5
[root@localhost ~]# sed '2,4 w a' file ==>將第二行到第四行的內容保存至a文件中 1 2 3 4 5 [root@localhost ~]# cat a ==>a文件內容為file文件第二到第四行 2 3 4 [root@localhost ~]# sed '2r A' file ==>將A文件內容讀取至第二行后面 1 2 ahhahahah 3 4 5 [root@localhost ~]# cat A ahhahahah
sed工具
s///:查找替換,支持使用其他分隔符,s@@@,s###
替換標記:
g:行內全局替換
p:顯示替換成功的行
w /path/to/somefile:將替換的行保存至文件中
看下sed實例
1.sed ‘2p’ /etc/passwd
第二行顯示兩邊,其他行默認顯示,太長了就沒全顯示出來了
2.sed –n ‘2p’ /etc/passwd
因為-n選項禁用了模式空間默認輸出至屏幕的功能,所以只顯示了第二行
3.sed –n ‘1,4p’ /etc/passwd
和上面以上,所以只顯示1至4行
4.sed –n ‘/root/p’ /etc/passwd
只顯示包含root的行;
5.sed –n ‘2,/root/p’ /etc/passwd 從2 行開始
顯示從第二行開始,到第一個匹配到root的行結束之間的行
備注:/root/要從第二行后開始匹配
6.sed -n ‘/^$/=’ file 顯示空行行號
7.sed –n –e ‘/^$/p’ –e ‘/^$/=’ file
僅顯示空行和其行號
8.sed ‘/root/a\superman’ /etc/passwd 行后
在能夠匹配到root的行后面追加superman
9.sed ‘/root/i\superman’ /etc/passwd 行前
在能夠匹配到root的行前插入Superman
10.sed ‘/root/c\superman’ /etc/passwd
把能夠匹配到root的替換成superman
11.sed ‘/^$/d’ file
刪除空行
12.sed ‘1,10d’ file
刪除1到10行,因為總共才7行,刪光了還不夠,所以上面都不顯示
13.nl /etc/passwd | sed ‘2,5d’
刪除了第2到5行
14.nl /etc/passwd | sed ‘2a\tea’
在第二行后面追加tea
15.sed 's/test/mytest/g' example
將test替換成mytest,g表示全局替換
16.sed –n‘s/root/&superman/p’ /etc/passwd 單詞后
將root替換成rootsuperman,并只顯示匹配到root的行
備注:&代表前面匹配到的root
17.sed –n‘s/root/superman&/p’ /etc/passwd 單詞前
將root替換成supermanroot,并只顯示匹配到root的行
備注:&代表前面匹配到的root
18.sed -e ‘s/dog/cat/’ -e ‘s/hi/lo/’ pets
將dog替換成cat,將hi替換成lo,因為-e選項是可以多點編輯的,意思是可以同時編輯多個
19.sed –i.bak ‘s/dog/cat/g’ pets
-加上i選項會修改原文件,安全起見,備份原文件為pets.bak
高級編輯命令:
h:把模式空間中的內容覆蓋至保持空間中
H:把模式空間中的內容追加至保持空間中
g:從保持空間取出數據覆蓋至模式空間
G:從保持空間取出內容追加至模式空間
x:把模式空間中的內容與保持空間中的內容進行互換
n:讀取匹配到的行的下一行覆蓋至模式空間
N:追加匹配到的行的下一行至模式空間
d:刪除模式空間中的行
D :刪除 當前模式空間開端至\n 的內容(不在傳至標準輸出),放棄之后的命令,但是對剩余模式空間重新執行sed
還是看看實例好了
-
sed -n 'n;p' FILE
顯示偶數行
理解:讀取第一行時,第二行覆蓋至模式空間,并顯示,然后讀取第三行,
下一行第四行覆蓋至模式空間,并顯示,如此類推
2. sed '1!G;h;$!d' FILE
逆序顯示===>所有的命令都是針對模式空間
說明:讀取第一行時,1命令不處理,將第一行內容覆蓋至保存空間,將模式空間中的第一行刪除
讀取第二行時,將保存空間的內容追加至模式空間,此時模式空間里面有第二行第一行,
然后將此時模式空間的內容覆蓋至保存空間,然后刪掉模式空間的第二一行
讀取第三行時,將保存空間的內容追加至模式空間,此時模式空間里面有第三行第二行第一行,
然后此時模式空間的內容覆蓋至保存空間,然后刪掉模式空間的第三二一行
讀取第四(最后)行時,將保存空間的內容追加至模式空間,此時模式空間里面有第四行第三行第二行第一行,
然后此時模式空間的內容覆蓋至保存空間,最后一個命令不處理,模式空間顯示內容為第四三二一行
3. sed '$!N;$!D' FILE
顯示倒數兩行
說明:
讀取第一行時,將第二行追加至模式空間,然后刪除
讀取第三行時,將第四行追加至模式空間,然后刪除
讀取第五行時,將第六(最后)行追加至模式空間,然后顯示
4.sed '$!d' FILE
顯示最后一行
說明:
讀取第一行時,刪除
讀取第二行時,刪除
讀取第三行時,刪除
讀取第四行時,刪除
讀取第五行時,刪除
讀取第六(最后)行時,顯示
5. sed ‘G’ FILE
在每一行后面追加空行
說明:
讀取第一行時,將保持空間中的空行追加至模式空間,然后顯示
讀取第二行時,將保持空間中的空行追加至模式空間,然后顯示
讀取第三行時,將保持空間中的空行追加至模式空間,然后顯示
讀取第四行時,將保持空間中的空行追加至模式空間,然后顯示
讀取第五行時,將保持空間中的空行追加至模式空間,然后顯示
讀取第六行時,將保持空間中的空行追加至模式空間,然后顯示
6.sed ‘g’ FILE
將每一行替換成空行
說明:
讀取第一行時,將保持空間中的空行覆蓋至模式空間,然后顯示
讀取第二行時,將保持空間中的空行覆蓋至模式空間,然后顯示
讀取第三行時,將保持空間中的空行覆蓋至模式空間,然后顯示
讀取第四行時,將保持空間中的空行覆蓋至模式空間,然后顯示
讀取第五行時,將保持空間中的空行覆蓋至模式空間,然后顯示
讀取第六行時,將保持空間中的空行覆蓋至模式空間,然后顯示
7. sed ‘/^$/d;G’ FILE
沒搞明白,待研究
8.sed 'n;d' FILE
顯示奇數行
說明:
讀取第一行時,第二行覆蓋至模式空間,然后刪除
讀取第三行時,第四行覆蓋至模式空間,然后刪除
讀取第五行時,第六行覆蓋至模式空間,然后刪除
9.sed -n '1!G;h;$p' FILE
逆序顯示
說明:
讀取第一行時,1命令不處理,將第一行內容覆蓋至保存空間,將模式空間中的第一行不顯示
讀取第二行時,將保存空間的內容追加至模式空間,此時模式空間里面有第二行第一行,
然后將此時模式空間的內容覆蓋至保存空間,然后模式空間的第二一行不顯示
讀取第三行時,將保存空間的內容追加至模式空間,此時模式空間里面有第三行第二行第一行,
然后此時模式空間的內容覆蓋至保存空間,然后模式空間的第三二一行不顯示
讀取第四(最后)行時,將保存空間的內容追加至模式空間,此時模式空間里面有第四行第三行第二行第一行,
然后此時模式空間的內容覆蓋至保存空間,最后一行,模式空間顯示內容為第四三二一行
原創文章,作者:qiuwei,如若轉載,請注明出處:http://www.www58058.com/32090