您好,登錄后才能下訂單哦!
sed:stream editor 流編輯器
sed的工作模式;sed是一個(gè)行文本編輯器,默認(rèn)每次處理文本中所匹配到一行內(nèi)容到模式空間,然后用后面的命令進(jìn)行操作,操作完成之后,會(huì)把模式空間
里面的內(nèi)容實(shí)現(xiàn)在屏幕上,然后把模式空間的中的內(nèi)容刪除,同時(shí)把下一行所匹配到內(nèi)容讀入模式空間
為了下面演示方便,我們創(chuàng)建一個(gè)文本文件a.text
#cat a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
sed [options] 'addresscommand' file (1)
sed [options] -f scriptfile file (2)
(2)是sed的腳本用法后面會(huì)介紹到
先介紹語法(1)種用法:**
linenumber:指定特定行號(hào)
startline,endline:指定起始行號(hào),和結(jié)束行號(hào)
linenumber,+N :N數(shù)字,表示從指定行號(hào)向后N行
/patten/:以正則表達(dá)式的匹配模式
/patten1/,/patten2/:從模式匹配1到模式匹配2
-n 靜默模式 常使用p命令時(shí)會(huì)用
-i 改變?cè)募?br/>-f file 跟腳本文件
-e 可以執(zhí)行多個(gè)命令語句
p:打印模式空間中行
d:刪除,刪除選擇的行
r file:讀取file中的內(nèi)容追加到匹配的行后面
R file:讀取file中的內(nèi)容的第一行追加到匹配行的后面
w file:將匹配到的行,保存到file中
W file:將匹配到的行的第一行,保存到file中
a \string 在當(dāng)前行下面插入文本。
i \string 在當(dāng)前行上面插入文本。
! 表示后面的命令對(duì)所有沒有被選定的行發(fā)生作用.
y 和s用法類似,但只能替換大小寫
s/patten/string/ 把patten匹配到的換成string字符
g表示全局替換
\1表示前面第一個(gè)左括號(hào)所表示的內(nèi)容,\2表示前面第二個(gè)左括號(hào)中表示的內(nèi)容,以此類推
&表示前面匹配到的內(nèi)容
^ 匹配行開始,如:/^sed/匹配所有以sed開頭的行。
$ 匹配行結(jié)束,如:/sed$/匹配所有以sed結(jié)尾的行。
. 匹配一個(gè)非換行符的任意字符,如:/s.d/匹配s后接一個(gè)任意字符,最后是d。
下面我們看例子:
1,只顯示a.text中的2行
root@debian9:~# sed -n '2p' a.text
ce xx xx tom xx rhce xx tom xx
注意,我們也里面要用到-n 選項(xiàng),如果不用-n 靜默模式的話,
它會(huì)顯示全部?jī)?nèi)容(這是sed的默認(rèn)動(dòng)作,可以看一下工作模式),匹配到的內(nèi)容會(huì)顯示兩遍
2,刪除a.text 中2-4行
root@debian9:~# sed "2,4d" a.text
zz xx tom xx tom rhce xx rh
yyyy rhce yyyyy
3,上面刪除a.text中2-4行,也可以這樣表示
root@debian9:~# sed "2,+2d" a.text
zz xx tom xx tom rhce xx rh
yyyy rhce yyyyy
4,刪除以x開頭的行。
root@debian9:~# sed "/^x/d" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
yyyy rhce yyyyy
5,刪除a.text中以第一個(gè)zz開頭的行到第一個(gè)xx開頭的行結(jié)束。
root@debian9:~# sed "/^zz/,/^xx/d" a.text
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
1,i \string 的用法,在a.text中ce開頭的行前面追加 i love linux 的新行
root@debian9:~# sed "/^ce/i \i love linux" a.text
zz xx tom xx tom rhce xx rh
i love linux
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
2,a \string 的用法和i \string 類似 在a.text中ce開頭的行后面追加i love linux 的新行
root@debian9:~# sed "/^ce/a \i love linux" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
i love linux
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
3,r file的用法,把/etc/fstab 追加到a.text中含有y的行。
root@debian9:~# sed "/.*y.*/r /etc/fstab" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
/etc/fstab: static file system information.
<file system> <mount point> <type> <options> <dump> <pass>
/ was on /dev/sda1 during installation
UUID=d12e3f89-049d-45c1-8b31-3a1cf551585f / ext4 errors 0 1
swap was on /dev/sda5 during installation
UUID=07308ec5-870b-46f0-b983-ebc2a56fb0f2 none swap sw 0 0
/dev/sr0 /media/cdrom0 udf,iso9660 user,noauto 0 0
4,w file 的用法,把a(bǔ).text中含有tom的行,保存到/root/b.text
root@debian9:~# sed "/tom/w /root/b.text" a.text
root@debian9:~# cat b.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
5,s/patten/string/的使用。把a(bǔ).text 中第一個(gè)tom換成jerry .
root@debian9:~# sed "s/tom/jerry/" a.text
zz xx jerry xx tom rhce xx rh
ce xx xx jerry xx rhce xx tom xx
xx xx jerry xx rhce xx xx
xxx xxx jerry rhce xx xx
yyyy rhce yyyyy
提示;sed默認(rèn)只替換第一個(gè)匹配到的patten.如果想替換只替換第二tom為jerry
這時(shí)替換標(biāo)記就用作用了
這條命令可以這樣寫:sed "s/tom/jerry/2" a.text 以此類推??梢蕴鎿Q想要替換的,
如果要想替換全部的可以寫成
sed "s/tom/jerry/g" a.text
root@debian9:~# sed "s/tom/jerry/g" a.text
zz xx jerry xx jerry rhce xx rh
ce xx xx jerry xx rhce xx jerry xx
xx xx jerry xx rhce xx xx
xxx xxx jerry rhce xx xx
yyyy rhce yyyyy
&和\1的用法,&和\1的相同之處,和不同點(diǎn)。
把she like my love 中 like和love后面都加上一個(gè)r.變成she liker my lover
root@debian9:~# echo "she like my love" | sed "s/l..e/&r/g"
she liker my lover
注釋,&表示前一個(gè)/patten/中的內(nèi)容
root@debian9:~# echo "she like my love" | sed "s/\(l..e\)/\1r/g"
she liker my lover
可以用分組的方法來實(shí)現(xiàn)后向引用。
如果把she like my love 中l(wèi)ike和love中的l變成L。變成she Like my Love
root@debian9:~# echo "she like my love" | sed "s/l\(..e\)/L\1/g"
she Like my Love
這樣的只能用分組來實(shí)現(xiàn)。不能用&來引用。
=:顯示行號(hào)
n:讀取匹配模式的行的下一行到模式空間中.注:模式空間中匹配模式的行被刪除。
N:讀取匹配模式的行,和匹配模式行的下一行。
h 拷貝模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)。如果原來緩沖區(qū)有內(nèi)容被覆蓋
H 追加模板塊的內(nèi)容到內(nèi)存中的緩沖區(qū)。
g 獲得內(nèi)存緩沖區(qū)的內(nèi)容,并替代當(dāng)前模板塊中的文本。
G 獲得內(nèi)存緩沖區(qū)的內(nèi)容,并追加到當(dāng)前模板塊文本的后面
1,= 的用法。顯示以ce開頭的是第幾行。
root@debian:~# sed "/^ce/=" a.text
zz xx tom xx tom rhce xx rh
2
ce xx xx tom xx rhce xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
2,n 的用法。把zz開頭的行,下一行中的tom全部換成TOM
root@debian:~# sed "/^zz/{n;s/tom/TOM/g}" a.text
zz xx tom xx tom rhce xx rh
ce xx xx TOM xx rhce xx TOM xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
3,N的用法,把zz開頭的行和下一行中的rhce全部換成RHCA.
root@debian:~# sed "/^zz/{N;s/rhce/RHCA/g;s/rh\nce/RH\nCA/}" a.text
zz xx tom xx tom RHCA xx RH
CA xx xx tom xx RHCA xx tom xx
xx xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
首先,要用N讀取zz開頭的行和它的下一行,可以看到zz行的結(jié)尾處rh和ce開頭的行是兩行,
用s/rhce/RHCA/g不會(huì)被替換。所以我們還要s/rh\nce/RH\nCA/來替換。
如果我們使用多行模式,^就不是表示行的開頭,而是模式空間里的開頭,$也不是行的結(jié)尾了,而是行的結(jié)尾
root@debian:~# sed "/^xx/{N;s/^xx/qq/g}" a.text
zz xx tom xx tom rhce xx rh
ce xx xx tom xx rhce xx tom xx
qq xx tom xx rhce xx xx
xxx xxx tom rhce xx xx
yyyy rhce yyyyy
分析:如果不是模式空間的開頭,那么下面兩個(gè)xx也會(huì)被替換成qq.
h和G的用法:
我們新建一個(gè)文本b
#cat b
a
b
aa
bb
4,通過模式空間和保持空間的轉(zhuǎn)化實(shí)現(xiàn)的效果
root@debian:~# sed "/a/{h;d};/b/G" b
b
a
bb
aa
sed [options] -f scriptfile file (2)
通常通過腳本對(duì)文件批量處理;
如一個(gè)文件中需要多出用sed 修改可以使用腳本
腳本文件格式為:'addresscommand'
'addresscommand'
......
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。