电竞比分网-中国电竞赛事及体育赛事平台

分享

Linux系統(tǒng) 文本三劍客之sed詳解 從此不求人

 蘇醒的貝殼 2019-08-24

一. 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]+)/&/ '

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多