shell腳本編程系列
學(xué)習(xí)sed編輯器
sed編輯器被稱作流編輯器(stream editor),與普通的交互式文本編輯器不同,在交互式文本編輯器可以用鍵盤命令交互式插入、刪除或替換文本數(shù)據(jù)。流編輯器則是根據(jù)事先設(shè)計好的一組規(guī)則編輯數(shù)據(jù)流。
sed編輯器主要操作
- 從輸入中讀取一行數(shù)據(jù)
- 根據(jù)所提供的編輯器命令匹配數(shù)據(jù)
- 按照命令修改數(shù)據(jù)流中的數(shù)據(jù)
- 將新的數(shù)據(jù)輸出到STDOUT
- 按順序逐行按照以上步驟處理數(shù)據(jù)
sed命令的格式為
sed options script file
options參數(shù)允許修改sed命令的行為,比如
- -n不產(chǎn)生輸出,使用p(print)命令完成輸出
- -f file在處理輸入時,將file中指定的命令添加到已有的命令中
- -e commands則是在處理輸入時,加入額外的sed命令。
script參數(shù)指定了應(yīng)用于流數(shù)據(jù)中的單個命令,如果需要多個命令,則使用-e選項指定,也可以使用-f選項在單獨的文件中指定。
在命令行中定義編輯器命令
echo "This is a test" | sed 's/test/big test/'
使用s替換命令,替換命令會用斜線間指定的第二個字符串替換第一個字符串,本例中,big test替換了test
sed 's/dog/cat/' data1.txt
讀取文件,修改其中的內(nèi)容,然后發(fā)送到STDOUT
在命令行中使用多個編輯器命令
sed -e 's/brown/red/;s/dog/cat/' data1.txt
兩個命令都應(yīng)用于文件的每一行數(shù)據(jù)。命令之間必須以分號分隔,并且在命令末尾和分號之間不能出現(xiàn)空格
如果不想再多個命令之間使用分號,也可以使用次提示符來分隔命令。必須在閉合單引號所在行結(jié)束命令,bash shell一旦發(fā)現(xiàn)了閉合單引號,就會執(zhí)行命令
[root@192 Chapter19-Scripts]# sed -e '
> s/brown/green/
> s/fox/toad/
> s/dog/cat/' data1.txt
從文件中讀取編輯器命令
sed -f script1.sed data1.txt
腳本中的內(nèi)容為
s/brown/green/
s/fox/toad/
s/dog/cat/
在這種情況下,不用在每條命令后面加分號
sed編輯器基礎(chǔ)命令
更多的替換選項
替換標(biāo)志
在默認(rèn)情況下,替換命令s只替換每行中出現(xiàn)的第一處匹配文本,要想替換所有的匹配文本,則必須使用替換標(biāo)志(substitution flag)。替換標(biāo)志在替換命令字符串之后設(shè)置,其格式為
s/pattern/replacement/flags
有4種可用的替代標(biāo)志
數(shù)字:指明新文本將被替換行中的第幾處匹配
- g:替換行中所有的匹配
- p:指明打印出替換后的行
- w file:將替換后的結(jié)果寫入文件
替換每行中第二處匹配文本
sed 's/test/trial/2' data4.txt
替換文本行中所有的匹配文本
sed 's/test/trial/g' data4.txt
sed -n 's/test/trial/p' data5.txt
替換標(biāo)志p會打印出包含替換命令中指定匹配模式的文本行,通常會和-n選項配合使用,-n選項會抑制sed編輯器的輸出,而替換標(biāo)志p會輸出替換后的行。二者配合只會輸出被替換命令修改過的行
sed -n 's/test/trial/w test.txt' data5.txt
替換標(biāo)志w會將匹配的行輸出保存到指定文件中。sed編輯器的正常輸出會被保存在STDOUT中,只有那些包含匹配模式的行會被保存在指定的輸出文件中。
替換字符
字符串中有一些不太方便在替代模式中使用的字符,比如正斜線(/),因為正斜線被用作替換命令的分隔符,因此它在匹配模式和替換文本中同時出現(xiàn)時,必須使用反斜線來轉(zhuǎn)義。
比如
sed 's/\/bin\/bash/\/bin\/csh/' /etc/passwd
但是這樣很容易造成混亂和錯誤,因此sed編輯器允許選擇其他字符作為替換命令的替代分隔符
sed 's!/bin/bash!/bin/csh!' /etc/passwd
使用感嘆號作為替換命令的分隔符
使用地址
在默認(rèn)情況下,在sed編輯器中使用的命令會應(yīng)用于所有的文本行,如果只想將命令應(yīng)用于特定的某一行或某些行,則必須使用行尋址。
在sed命令中有兩種形式的行尋址:
- 以數(shù)字形式表示的行區(qū)間
- 匹配行內(nèi)文本的模式
以上兩種形式使用相同的格式來指定地址
[address] command
也可以將針對特定地址的多個命令分組:
address{
command1
command2
command3
}
sed編輯器會將指定的各個命令應(yīng)用于匹配指定地址的文本行
- 數(shù)字形式的行尋址
行地址既可以是單個行號
sed '2s/dog/cat/' data1.txt
也可以是用起始行號、逗號以及結(jié)尾行號指定的行區(qū)間
sed '2,3s/dog/cat/' data1.txt
美元符號作為結(jié)尾行號
sed '2,$s/dog/cat/' data1.txt
- 使用文本模式過濾
/pattern/command
必須將指定的模式(pattern)放在正斜線內(nèi)
比如只想修改test用戶的默認(rèn)shell
sed '/test/s/bash/csh/' /etc/passwd
上面的案例使用固定的文本模式過濾特定的值,但有局限,sed編輯器也支持在文本模式中使用正則表達(dá)式來創(chuàng)建匹配效果更好的模式
- 使用組的方式替換文本
[root@192 Chapter19-Scripts]# sed '2{
> s/fox/toad/
> s/dog/cat/
> }' data1.txt
刪除行
刪除命令(d)會刪除匹配指定模式的所有行。使用時需要小心,如果沒有指定尋址方式,則流中的所有文本都會被刪除。
sed 'd' data1.txt
- 通過行號指定要刪除的行
- 通過特定行區(qū)間指定
sed '2,3d' data6.txt
- 通過特殊的末位字符$指定位置
sed '3,$d' data6.txt
sed編輯器的模式匹配特性也適用于刪除命令
sed '/number 1/d' data6.txt
也可以使用兩個文本模式來刪除匹配區(qū)間的行,但是要注意,第一個模式啟動行刪除功能,而第二個模式關(guān)閉行刪除功能,如果匹配了第一個模式之后,剩余文本中沒有匹配第二個模式的,則從匹配了第一個模式的行之后,都會被刪除
插入和附加文本
sed '[address]command new line'
插入(insert)(i)命令會在指定行前增加一行
echo 'Test Line 2' | sed 'i\Test line 1'
追加(append)(a)命令會在指定行后增加一行
echo 'Test Line 2' | sed 'a\Test line 1'
要向數(shù)據(jù)流內(nèi)部插入或附加數(shù)據(jù),必須用地址告訴sed編輯器希望數(shù)據(jù)出現(xiàn)在什么位置。使用行號或文本模式都行,但不能用行區(qū)間。
sed '3i\This is an inserted line.' data6.txt
會在文本的第3行之前插入數(shù)據(jù)
sed '3a\This is an inserted line.' data6.txt
會在文本的第3行之后插入數(shù)據(jù)
sed '$a\This is an inserted line.' data6.txt
直接附加到行尾
修改行
修改(c)命令允許修改數(shù)據(jù)流中整行文本的內(nèi)容,跟插入和追加命令的工作機(jī)制一樣,必須在sed命令中單獨指定一行
修改第二行的文本
sed '2c\This is a changed line of test.' data6.txt
文本模式會修改匹配的任意文本行
sed '/have 6 Infinity Stones/c\Snap!This is changed line of text.' data8.txt
使用地址區(qū)間需要小心,結(jié)果是將多行修改成了一行,而不是將匹配的多行都修改
轉(zhuǎn)換命令
轉(zhuǎn)換命令(y)是唯一可以處理單個字符的sed編輯器命令
[address]y/inchars/outchars
轉(zhuǎn)換命令會對inchars和outchars進(jìn)行一對一的映射。inchars中的第一個字符會被轉(zhuǎn)換成第一個字符,inchars中的第二個字符會被轉(zhuǎn)換為第二個字符,這個映射過程會一直持續(xù)到處理完指定字符。如果inchars和outchars的長度不同,則sed編輯器會產(chǎn)生一條錯誤消息。
轉(zhuǎn)換命令是一個全局命令,會對文本中所有匹配到的字符進(jìn)行轉(zhuǎn)換,不考慮字符出現(xiàn)的位置
echo "Test #1 of try #1." | sed 'y/123/678/'
再探打印
- 打印命令(p)用于打印文本行
echo "This is a test" | sed 'p'
打印出所有的文本
sed -n '/3rd line/p' data6.txt
打印出包含匹配文本模式的行
sed -n '2,3p' data6.txt
打印出數(shù)據(jù)流中的部分行
sed -n '/3/{p;s/line/test/p}' data6.txt
在使用替換或修改命令做出改動之前查看相應(yīng)的行
- 等號(=)命令用于打印行號
sed -n '/text/{=;p}' data7.txt
數(shù)據(jù)流中查找特定文本,然后打印行號和內(nèi)容
- 列出(l)命令用于列出行
列出命令可以打印數(shù)據(jù)流中的文本和不可打印字符
sed -n 'l' data10.txt
使用sed處理文件
- 寫入文件
寫入(w)命令用來向文件寫入行,命令格式如下:
[address]w filename
filename可以使用相對路徑或絕對路徑,運(yùn)行sed編輯器的用戶必須具有文件的寫權(quán)限。地址可以是sed支持的任意類型的尋址方式,比如單個行號、文本模式、行區(qū)間或文本模式區(qū)間。
sed '1,2w test.txt' data6.txt
將數(shù)據(jù)流的前兩行寫入文本文件
sed -n '1,2w test.txt' data6.txt
不在STDOUT中顯示文本行,可以使用sed的-n選項
- 將匹配文本模式的數(shù)據(jù)行寫入目標(biāo)文件
sed -n '/Browncoat/w Browncoats.txt' data12.txt
- 從文件讀取數(shù)據(jù)
可以通過i或者a向數(shù)據(jù)流中插入或追加內(nèi)容,而讀取(r)命令允許將一條獨立文件中的數(shù)據(jù)插入數(shù)據(jù)流,格式如下
[address]r filename
filename參數(shù)指定了數(shù)據(jù)文件的絕對路徑或相對路徑。讀取命令中無法使用地址區(qū)間,只能指定單個行號或文本模式地址。sed編輯器會將文件內(nèi)容插入指定地址之后。
sed '3r data13.txt' data6.txt
要在數(shù)據(jù)流的末尾添加文本,只需要使用美元符號地址即可
sed '$r data13.txt' data6.txt
使用文本模式地址將數(shù)據(jù)文件中的所有行插入數(shù)據(jù)流
讀取命令還有一個很酷的用法是和刪除命令配合使用,利用另一個文件中的數(shù)據(jù)來替換文件中的占位文本文章來源:http://www.zghlxwxcb.cn/news/detail-430017.html
[root@192 Chapter19-Scripts]# cat notice.std
Would the following people:
LIST
please report to the ship's captain.
[root@192 Chapter19-Scripts]# cat data12.txt
Blum, R Browncoat
McGuiness, A Alliance
Bresnahan, C Browncoat
Harken, C Alliance
[root@192 Chapter19-Scripts]# sed '/LIST/{
> r data12.txt
> d
> }' notice.std
文章來源地址http://www.zghlxwxcb.cn/news/detail-430017.html
到了這里,關(guān)于sed編輯器基礎(chǔ)命令的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!