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工作流程的理解圖。

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 :-e 表達(dá)式
|
報(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 :-e 表達(dá)式
[root@localhost test ]
hi,everyone
now I will show how to use cat
[root@localhost test ]
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 ]
hi,everyone
now I will show how to use cat
[root@localhost test ]
hi,e
now I will show how to use
[root@localhost test ]
hi,
now I will show how to us
|
p :顯示替換成功的行
g :全局替換
w filename : 將替換成功的結(jié)果保存至指定文件中
查找替換在sed中應(yīng)用很廣,下面很多例子都是以sed的替換功能實(shí)現(xiàn)的
p :顯示當(dāng)前模式空間中的內(nèi)容 Print the current pattern space.
注:同時(shí)使用多個(gè)編輯命令,命令之間要用;隔開(kāi)(!除外)
例子如下:
1 2 3 4 5 6 7 | [root@localhost test ]
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ì)員登錄
賬號(hào)登錄還沒(méi)有賬號(hào)?立即注冊(cè)
-
售前咨詢
售前咨詢服務(wù)時(shí)間:09:00-23:30
售前值班
4006-75-4006
咨詢熱線:
4006-75-4006(09:00-23:30)
0871-6388 6388 (總機(jī))(工作日 09:00-18:00)
-
售后咨詢
售后咨詢服務(wù)時(shí)間:00:00-24:00
24H值班技術(shù)
4006-75-4006
-
備案咨詢
備案咨詢服務(wù)時(shí)間:09:00-18:00(工作日)
備案專業(yè)客服
0871-6388 6388
-
電話
0871-6388 6388 (總機(jī))
- 工單
-
二維碼
-
TOP
|