|
一. sed簡(jiǎn)介 sed全名為stream editor,六編輯器,用程序的方式來(lái)編輯文本,功能十分強(qiáng)大 sed是一種分交互式編輯器,它使用預(yù)先設(shè)定好的編輯指令對(duì)輸入的文本進(jìn)行編輯,完成后再輸出編輯結(jié)構(gòu).sed基本上都是使用正則表達(dá)式進(jìn)行模式比配 二. sed的工作原理 sed會(huì)一次處理一行內(nèi)容.處理時(shí),把當(dāng)前處理的行存儲(chǔ)在臨時(shí)緩沖區(qū),形成”模式空間”,接著用sed命令處理緩沖區(qū)中的內(nèi)容,處理結(jié)束后,把緩沖區(qū)的內(nèi)容送往屏幕.接著處理下一行的內(nèi)容,這樣不斷重復(fù),直至文件末尾.文件內(nèi)容并沒(méi)有發(fā)生改變,除非使用重定向存儲(chǔ)輸出 三. sed的基本語(yǔ)法 sed [選項(xiàng)] `command` 文件名稱(chēng) 常用選項(xiàng)包括: -n,-e,-i,-f,-r command包括: [地址1, 地址2] [函數(shù)] [參數(shù)(標(biāo)記)] 四. 常用選項(xiàng) -n: 取消打印到屏幕 sed默認(rèn)會(huì)把模式空間處理完畢后的內(nèi)容輸出到標(biāo)準(zhǔn)輸出,也就是輸出到屏幕上,加上-n選項(xiàng)后被設(shè)定為安靜模式,也就是不會(huì)輸出默認(rèn)打印信息,除非子命令中特別指定打印選項(xiàng),則只會(huì)把匹配修改的行進(jìn)行打印。 例1. echo -e 'hello world\nnihao' | sed 's/hello/A/' 結(jié)果: A world nihao 例2. echo -e 'hello world\nnihao' | sed -n 's/hello/A/' 結(jié)果:加-n選項(xiàng)后什么也沒(méi)有顯示。 例3. echo -e 'hello world\nnihao' | sed -n 's/hello/A/p' 結(jié)果:A world/ 說(shuō)明:-n選項(xiàng)后,再加p標(biāo)記,只會(huì)把匹配并修改的內(nèi)容打印了出來(lái)。 -i 保存編輯內(nèi)容至源文件 例1. cat file.txt 結(jié)果: hello world sed '/s/hello/A' file.txt 結(jié)果: A world cat file.txt 結(jié)果: hello world 例2. sed -i '/s/hello/A' file.txt cat file.txt 結(jié)果: A world 例3. 備份源文件 sed i.bak 's/hello/A/' file.txt ls 結(jié)果: file.txt file.txt.bak -e: 多點(diǎn)編輯,表示且關(guān)系 如果需要用sed對(duì)文本內(nèi)容進(jìn)行多種操作,則需要執(zhí)行多條子命令來(lái)進(jìn)行操作。 例1. echo -e 'hello world' | sed -e 's/hello/A/' -e 's/world/B/' 結(jié)果: A B 例2. echo -e 'hello world' | sed -e 's/hello/A/;s/world/B/' 結(jié)果: A B -f: 從指定文本中讀取編輯腳本的sed語(yǔ)句 vim sed.script # 在腳本文件中的子命令串就不需要輸入單引號(hào)了 s/hello/A/ s/world/B/ echo 'hello world' | sed -f sed.script 結(jié)果:A B -r: 支持使用擴(kuò)展正則表達(dá)式 sed命令的匹配模式支持正則表達(dá)式的,默認(rèn)只能支持基本正則表達(dá)式,如果需要支持?jǐn)U展正則表達(dá)式,那么需要添加-r選項(xiàng)。 echo 'hello world' | sed -r 's/(hello)|(world)/A/g' 結(jié)果: A A 五.地址定界 定址概念 默認(rèn)情況下會(huì)對(duì)文本的每一行內(nèi)容進(jìn)行匹配,處理,輸出,但如果我們只需文本的某些部分,就可使用定位特定的行還處理,這個(gè)定位指定的行的行為就叫"定址" 數(shù)字定址 數(shù)字定址就是指定具體的行去編輯,數(shù)字定址有幾種方法 例1. 將文本的第4行的hello字符串替換成A,其他方不會(huì)被替換 sed -n '4s/hello/A/' message 例2. 將文本的2-4行的hello字符串替換成A sed -n '2,4s/hello/A/' message 例3. 從文本的第2行開(kāi)始往下數(shù)4行,也就是2-6行中的hello替換成A sed -n '2,+4s/hello/A/' message 例4.從第4行開(kāi)始,每隔3行就減hello替換成A sed -n '4~3/hello/A/' message 例5. $表示最后一行 !表示相反的行數(shù) sed -n '$s/hello/A/' message #匹配最后一行 sed -n '1!s/hello/A/' message #除了第一行 3.正則定址 正則定址是通過(guò)正則表達(dá)式來(lái)匹配編輯內(nèi)容所在行 例1. 將匹配到的行刪除 sed -n '/hello/d' message 例2. 刪除空行 sed -n '/^$/d' message 例3. 刪除以TS開(kāi)頭到TE開(kāi)頭之間的行 sed -n '/^TS,/TE/d' message 數(shù)字定址和正則定址的混用 例. 刪除從第1行到以TS開(kāi)頭的行之間的內(nèi)容 sed -n '/1,/^TS/d' message 定址的分組 例1 vim sed.script /^TS,/TE/{ # 匹配TS開(kāi)頭的行到TE開(kāi)頭的行之間的內(nèi)容 s/CN/China/ # CN替換成China s/Beijing/BJ/ # Beijing 替換成 BJ } sed -f sed.script message 例2 sed -n '2,4s{/cn/china/;/a/b/}' message 六 sed的基本子命令 子命令a:表示在指定行下插入指定內(nèi)容,以空格做分界線(xiàn) 例1:將message文件中每一行下邊都插入添加一行內(nèi)容是A。 sed 'a A' message 例2:將message文件中1-2行的下邊插入添加一行內(nèi)容是A sed '1,2a A' message 例3:將message文件中1-2行的下邊分別添加3行,3行內(nèi)容分別是A、B、C, sed '1,2a A\nB\nC' message 2.子命令i:在指定行上邊插入指定行的內(nèi)容 例1:將message文件中每一行上邊都插入添加一行內(nèi)容是A sed '/i A' message 例2:將message文件中1-2行的上邊插入添加一行內(nèi)容是A sed '/1,2i A' message 例3:將message文件中1-2行的上邊分別添加3行,3行內(nèi)容分別是A、B、C sed '/1,2i A\nB\nC' message 3.子命令c:把指定的行內(nèi)容替換為自己需要的行內(nèi)容 例1:將message文件中所有的行內(nèi)容都分別替換為A行內(nèi)容。 sed 'c A' message 例2:將message文件中1-2行的內(nèi)容替換為A,只替換成一個(gè)A sed '1,2c A' message 例3:將message中1-2行內(nèi)容分別替換為了A sed '1,2c A\nA' message 4.子命令d:表示刪除指定的行內(nèi)容 例1:刪除message內(nèi)的所有行 sed 'd' message 例2:刪除message內(nèi)的1-3行 sed '1,3d' message 5.子命令y:字符替換,可替換多個(gè)字符,卻不可以替換字符串且不支持正則表達(dá)式 例子:把message中所有a字符替換為A符號(hào),所有b字符替換為B符號(hào)。 sed 'y/ab/AB' message 強(qiáng)調(diào)一下,這里的替換源字符個(gè)數(shù)和目的字符個(gè)數(shù)必須相等; 6.子命令=:在指定行的上邊顯示行號(hào) 例:打印1,2的行號(hào) sed '1,2=' message 7.子命令r:將內(nèi)容追加到指定行的下邊 例:將a.txt文件內(nèi)容讀取并插入到message文件第2行的下邊 sed '2r a.txt' message 8.子命令s:字符串替換,支持正則表達(dá)式 基本語(yǔ)法: 【address】s / pattern / replacememt / flags s字符串替換,替換的時(shí)候可以把/換成其他的符號(hào),比如 = replacement: &: 用正則表達(dá)式匹配的內(nèi)容進(jìn)行替換 \n:回調(diào)參數(shù) \(\): 保存被匹配的字符一杯反向引用 \n時(shí)使用 Flags: n:可以是1-512,表示第n次出現(xiàn)的情況進(jìn)行替換 g:全局更改 p:打印模式空間的內(nèi)容 w file:寫(xiě)入到一個(gè)文件的file中 實(shí)戰(zhàn)用法: 測(cè)試文件: # cat message hello 123 world 例1:將message每行包含的第一個(gè)hello的字符串替換為HELLO sed 's/hello/HELLO/' message 結(jié)果:HELLO 123 world 例2:使用擴(kuò)展正則表達(dá)式匹配內(nèi)容,將匹配到的內(nèi)容替換成A sed -r 's/[a-z]+ [0-9]+ [a-z]+/A/' message 結(jié)果: A 例3:使用正則分組功能,\1表示第一個(gè)分組,\2表示第二個(gè)分組,\3表示第三個(gè)分組 sed -r 's/([a-z]+ ) ([0-9]+) ([a-z]+ /\3\2\1/)' message 結(jié)果: world 123 hello 例4:使用&功能,代表整個(gè)匹配結(jié)果,111&222,表示將整個(gè)結(jié)果插入111 222之間 sed -r 's/([a-z]+ ) ([0-9]+) ([a-z]+)/&/ ' |
|
|