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