Linux系統 文本三劍客之sed詳解 從此不求人

一. sed簡介

 sed全名為stream editor,六編輯器,用程序的方式來編輯文本,功能十分強大

sed是一種分交互式編輯器,它使用預先設定好的編輯指令對輸入的文本進行編輯,完成後再輸出編輯結構.sed基本上都是使用正則表達式進行模式比配

二. sed的工作原理

 sed會一次處理一行內容.處理時,把當前處理的行存儲在臨時緩衝區,形成”模式空間”,接著用sed命令處理緩衝區中的內容,處理結束後,把緩衝區的內容送往屏幕.接著處理下一行的內容,這樣不斷重複,直至文件末尾.文件內容並沒有發生改變,除非使用重定向存儲輸出

三. sed的基本語法

sed [選項] `command` 文件名稱

常用選項包括: -n,-e,-i,-f,-r

command包括: [地址1, 地址2] [函數] [參數(標記)]

四. 常用選項

-n: 取消打印到屏幕

sed默認會把模式空間處理完畢後的內容輸出到標準輸出,也就是輸出到屏幕上,加上-n選項後被設定為安靜模式,也就是不會輸出默認打印信息,除非子命令中特別指定打印選項,則只會把匹配修改的行進行打印。

例1.

echo -e 'hello world\nnihao' | sed 's/hello/A/'

結果:

A world

nihao

例2.

echo -e 'hello world\nnihao' | sed -n 's/hello/A/'

結果:加-n選項後什麼也沒有顯示。

例3.

echo -e 'hello world\nnihao' | sed -n 's/hello/A/p'

結果:A world/

說明:-n選項後,再加p標記,只會把匹配並修改的內容打印了出來。

例1.

cat file.txt

結果: hello world

sed '/s/hello/A' file.txt

結果: A world

cat file.txt

結果: hello world

例2.

sed -i '/s/hello/A' file.txt

cat file.txt

結果: A world

例3. 備份源文件

sed i.bak 's/hello/A/' file.txt

ls

結果: file.txt file.txt.bak

如果需要用sed對文本內容進行多種操作,則需要執行多條子命令來進行操作。

例1.

echo -e 'hello world' | sed -e 's/hello/A/' -e 's/world/B/'

結果: A B

例2.

echo -e 'hello world' | sed -e 's/hello/A/;s/world/B/'

結果: A B

-f: 從指定文本中讀取編輯腳本的sed語句

vim sed.script # 在腳本文件中的子命令串就不需要輸入單引號了

s/hello/A/

s/world/B/

echo "hello world" | sed -f sed.script

結果:A B

-r: 支持使用擴展正則表達式

sed命令的匹配模式支持正則表達式的,默認只能支持基本正則表達式,如果需要支持擴展正則表達式,那麼需要添加-r選項。

echo "hello world" | sed -r 's/(hello)|(world)/A/g'

結果: A A

五.地址定界

定址概念

默認情況下會對文本的每一行內容進行匹配,處理,輸出,但如果我們只需文本的某些部分,就可使用定位特定的行還處理,這個定位指定的行的行為就叫"定址"

數字定址

數字定址就是指定具體的行去編輯,數字定址有幾種方法

例1. 將文本的第4行的hello字符串替換成A,其他方不會被替換

sed -n '4s/hello/A/' message

例2. 將文本的2-4行的hello字符串替換成A

sed -n '2,4s/hello/A/' message

例3. 從文本的第2行開始往下數4行,也就是2-6行中的hello替換成A

sed -n '2,+4s/hello/A/' message

例4.從第4行開始,每隔3行就減hello替換成A

sed -n '4~3/hello/A/' message

例5. $表示最後一行 !表示相反的行數

sed -n '$s/hello/A/' message #匹配最後一行

sed -n "1!s/hello/A/" message #除了第一行

3.正則定址

正則定址是通過正則表達式來匹配編輯內容所在行

例1. 將匹配到的行刪除

sed -n '/hello/d' message

例2. 刪除空行

sed -n '/^$/d' message

例3. 刪除以TS開頭到TE開頭之間的行

sed -n '/^TS,/TE/d' message

數字定址和正則定址的混用

例. 刪除從第1行到以TS開頭的行之間的內容

sed -n '/1,/^TS/d' message

定址的分組

例1

vim sed.script

/^TS,/TE/{ # 匹配TS開頭的行到TE開頭的行之間的內容

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:表示在指定行下插入指定內容,以空格做分界線

例1:將message文件中每一行下邊都插入添加一行內容是A。

sed 'a A' message

例2:將message文件中1-2行的下邊插入添加一行內容是A

sed '1,2a A' message

例3:將message文件中1-2行的下邊分別添加3行,3行內容分別是A、B、C,

sed '1,2a A\nB\nC' message

2.子命令i:在指定行上邊插入指定行的內容

例1:將message文件中每一行上邊都插入添加一行內容是A

sed '/i A' message

例2:將message文件中1-2行的上邊插入添加一行內容是A

sed '/1,2i A' message

例3:將message文件中1-2行的上邊分別添加3行,3行內容分別是A、B、C

sed '/1,2i A\nB\nC' message

3.子命令c:把指定的行內容替換為自己需要的行內容

例1:將message文件中所有的行內容都分別替換為A行內容。

sed 'c A' message

例2:將message文件中1-2行的內容替換為A,只替換成一個A

sed '1,2c A' message

例3:將message中1-2行內容分別替換為了A

sed '1,2c A\nA' message

4.子命令d:表示刪除指定的行內容

例1:刪除message內的所有行

sed 'd' message

例2:刪除message內的1-3行

sed '1,3d' message

5.子命令y:字符替換,可替換多個字符,卻不可以替換字符串且不支持正則表達式

例子:把message中所有a字符替換為A符號,所有b字符替換為B符號。

sed 'y/ab/AB' message

強調一下,這裡的替換源字符個數和目的字符個數必須相等;

6.子命令=:在指定行的上邊顯示行號

例:打印1,2的行號

sed '1,2=' message

7.子命令r:將內容追加到指定行的下邊

例:將a.txt文件內容讀取並插入到message文件第2行的下邊

sed '2r a.txt' message

8.子命令s:字符串替換,支持正則表達式

基本語法:

【address】s / pattern / replacememt / flags

s字符串替換,替換的時候可以把/換成其他的符號,比如 =

replacement:

&: 用正則表達式匹配的內容進行替換

\n:回調參數

\(\): 保存被匹配的字符一杯反向引用 \n時使用

Flags:

n:可以是1-512,表示第n次出現的情況進行替換

g:全局更改

p:打印模式空間的內容

w file:寫入到一個文件的file中

實戰用法:

測試文件:

# cat message

hello 123 world

例1:將message每行包含的第一個hello的字符串替換為HELLO

sed 's/hello/HELLO/' message

結果:HELLO 123 world

例2:使用擴展正則表達式匹配內容,將匹配到的內容替換成A

sed -r 's/[a-z]+ [0-9]+ [a-z]+/A/' message

結果: A

例3:使用正則分組功能,\1表示第一個分組,\2表示第二個分組,\3表示第三個分組

sed -r 's/([a-z]+ ) ([0-9]+) ([a-z]+ /\3\2\1/)' message

結果: world 123 hello

例4:使用&功能,代表整個匹配結果,111&222,表示將整個結果插入111 222之間

sed -r 's/([a-z]+ ) ([0-9]+) ([a-z]+)/&/ '


分享到:


相關文章: