Linux-sed文本处理流编辑器
概述
Linux sed命令是利用script來(lái)處理文本文件。
sed可依照script的指令,來(lái)處理、編輯文本文件。
Sed主要用來(lái)自動(dòng)編輯一個(gè)或多個(gè)文件;簡(jiǎn)化對(duì)文件的反復(fù)操作;編寫(xiě)轉(zhuǎn)換程序等。
語(yǔ)法
sed [-hnV][-e<script>][-f<script文件>][文本文件]參數(shù)說(shuō)明:
- -e<script>或–expression=<script> 以選項(xiàng)中指定的script來(lái)處理輸入的文本文件。
- -f<script文件>或–file=<script文件> 以選項(xiàng)中指定的script文件來(lái)處理輸入的文本文件。
- -h或–help 顯示幫助。
- -n或–quiet或–silent 僅顯示script處理后的結(jié)果。
- -V或–version 顯示版本信息。
動(dòng)作說(shuō)明:
- a :新增, a 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的下一行)~
- c :取代, c 的后面可以接字串,這些字串可以取代 n1,n2 之間的行!
- d :刪除,因?yàn)槭莿h除,所以 d 后面通常不接任何內(nèi)容;
- i :插入, i 的后面可以接字串,而這些字串會(huì)在新的一行出現(xiàn)(目前的上一行);
- p :列印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
- s :取代,可以直接進(jìn)行取代的工作哩!通常這個(gè) s 的動(dòng)作可以搭配正規(guī)表示法!例如 1,20s/old/new/g 就是了!
栗子
[root@entel2 ~]# cat sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15以下例子中的數(shù)據(jù)均已上述sedTest.txt為準(zhǔn)
在文件的第四行后添加一行,并將結(jié)果輸出到標(biāo)準(zhǔn)輸出
[root@entel2 ~]# sed -e 4a\Line4 sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 Line4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15并不會(huì)修改源文件
以行為單位的新增/刪除
刪除第二行到第五行
[root@entel2 ~]# cat -b sedTest.txt | sed '2,5d'1 xiao gong jiang1 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15 [root@entel2 ~]# nl sedTest.txt |sed '2,5d'1 xiao gong jiang1 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15sed 的動(dòng)作為 ‘2,5d’ ,那個(gè) d 就是刪除!
因?yàn)?2-5 行給他刪除了,所以顯示的數(shù)據(jù)就沒(méi)有 2-5 行羅~
另外,注意一下,原本應(yīng)該是要下達(dá) sed -e 才對(duì),沒(méi)有 -e 也可以!
[root@entel2 ~]# nl sedTest.txt | sed -e '2,9d'1 xiao gong jiang1 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15同時(shí)也要注意的是, sed 后面接的動(dòng)作,推薦使用 ” 兩個(gè)單引號(hào)括住!
只刪除某一行
比如第二行
[root@entel2 ~]# nl sedTest.txt | sed '2d'1 xiao gong jiang1 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15刪除第 3 到最后一行
[root@entel2 ~]# nl sedTest.txt | sed -e '3,$d'1 xiao gong jiang1 2 xiao gong jiang2$ 標(biāo)識(shí)最后一行
在第二行后(亦即是加在第三行)增加內(nèi)容
[root@entel2 ~]# nl sedTest.txt | sed '2a this is added by sed'1 xiao gong jiang1 2 xiao gong jiang2 this is added by sed3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15在第二行前(亦即是加在第二行)增加內(nèi)容
[root@entel2 ~]# nl sedTest.txt | sed '2i this is added by sed'1 xiao gong jiang1 this is added by sed2 xiao gong jiang2 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15增加兩行以上,在第二行后面加入兩行字
[root@entel2 ~]# nl sedTest.txt | sed '2i this is added by sed \n and I am the sencond line '1 xiao gong jiang1 this is added by sed and I am the sencond line 2 xiao gong jiang2 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15或者
[root@entel2 ~]# nl sedTest.txt | sed '2a run or \ > walk '1 xiao gong jiang1 2 xiao gong jiang2 run or walk 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15每一行之間都必須要以反斜杠『 \ 』來(lái)進(jìn)行新行的添加。
以行為單位的替換與顯示
將第2-5行的內(nèi)容取代成為『a』
[root@entel2 ~]# nl sedTest.txt |sed '2,5c a'1 xiao gong jiang1 a6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15 [root@entel2 ~]# nl sedTest.txt |sed -e '2,5c a'1 xiao gong jiang1 a6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9 10 xiao gong jiang10 11 xiao gong jiang11 12 xiao gong jiang12 13 xiao gong jiang13 14 xiao gong jiang14 15 xiao gong jiang15通過(guò)這個(gè)方法可以取代整行。
僅列出文件內(nèi)的第 5-7 行
[root@entel2 ~]# nl sedTest.txt | sed -n '5,7p'5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7p :列印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
-n或–quiet或–silent 僅顯示script處理后的結(jié)果。如果不加 -n ,會(huì)把所有行和匹配行都輸出。
數(shù)據(jù)的搜尋并顯示
搜索jiang1關(guān)鍵字的行
[root@entel2 ~]# sed -n '/jiang1/p' sedTest.txt xiao gong jiang1 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15關(guān)鍵字需要用 /關(guān)鍵字/
p :列印,亦即將某個(gè)選擇的數(shù)據(jù)印出。通常 p 會(huì)與參數(shù) sed -n 一起運(yùn)行~
如果jiang1找到,除了輸出所有行,還會(huì)輸出匹配行。
使用-n的時(shí)候?qū)⒅淮蛴“0宓男小?/p>
如果不指定 -n ,如下:
[root@entel2 ~]# sed '/jiang1/p' sedTest.txt xiao gong jiang1 xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang10 xiao gong jiang11 xiao gong jiang11 xiao gong jiang12 xiao gong jiang12 xiao gong jiang13 xiao gong jiang13 xiao gong jiang14 xiao gong jiang14 xiao gong jiang15 xiao gong jiang15數(shù)據(jù)的搜尋并刪除
刪除所有包含jiang1的行,其他行輸出
[root@entel2 ~]# nl sedTest.txt|sed '/jiang1/d' 2 xiao gong jiang2 3 xiao gong jiang3 4 xiao gong jiang4 5 xiao gong jiang5 6 xiao gong jiang6 7 xiao gong jiang7 8 xiao gong jiang8 9 xiao gong jiang9數(shù)據(jù)的搜尋并執(zhí)行命令
改造下數(shù)據(jù):
將/etc/passwd root開(kāi)頭的打印出來(lái) 追加到 sedTest.txt文本中。
[root@entel2 ~]# sed -n '/^root/p' /etc/passwd >> sedTest.txt [root@entel2 ~]# cat sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15 root:x:0:0:root:/root:/bin/bash把 bash 改成 xiaogongjiang
[root@entel2 ~]# sed -n '/root/{s/bash/xiaogongjiang/;p}' sedTest.txt root:x:0:0:root:/root:/bin/xiaogongjiang數(shù)據(jù)的搜尋并替換
除了整行的處理模式之外, sed 還可以用行為單位進(jìn)行部分?jǐn)?shù)據(jù)的搜尋并取代。基本上 sed 的搜尋與替代的與 vi 相當(dāng)?shù)念?lèi)似!他有點(diǎn)像這樣:
sed 's/要被取代的字串/新的字串/g'字符g代表每行出現(xiàn)的字符全部替換,如果想在特定字符處添加,g就有用了,否則只會(huì)替換每行第一個(gè),而不繼續(xù)往后找了.
栗子
獲取etho0的網(wǎng)址信息
[root@entel2 ~]# ifconfig eth0 | grep "inet addr"inet addr:10.45.7.122 Bcast:10.45.17.255 Mask:255.255.252.0利用正則去掉ip前面的部分
[root@entel2 ~]# ifconfig eth0 | grep "inet addr" | sed 's/^.*addr://g' 10.45.7.122 Bcast:10.45.17.255 Mask:255.255.252.0去掉ip后面部分
[root@entel2 ~]# ifconfig eth0 | grep "inet addr" | sed 's/^.*addr://g' | sed 's/Bcast.*$//g' 10.45.7.122講解:
^ 匹配行首 例如 ^hello 會(huì)匹配以hello開(kāi)頭的行 . 匹配除了換行符外任意一個(gè)字符 * 前一個(gè)字符匹配0次或任意多次 $ 匹配行尾 例如 hello$ 會(huì)匹配以hello結(jié)尾的行多點(diǎn)編輯
一條sed命令,刪除/etc/passwd第三行到末尾的數(shù)據(jù),并把bash替換為blueshell
[root@entel2 ~]# nl /etc/passwd | sed -e '3,$d' -e 's/bash/blueshell/g'1 root:x:0:0:root:/root:/bin/blueshell2 bin:x:1:1:bin:/bin:/sbin/nologin-e表示多點(diǎn)編輯,第一個(gè)編輯命令刪除/etc/passwd第三行到末尾的數(shù)據(jù),第二條命令搜索bash替換為blueshell。
直接修改文件內(nèi)容(危險(xiǎn)動(dòng)作)
sed 可以直接修改文件的內(nèi)容,不必使用管道命令或數(shù)據(jù)流重導(dǎo)向! 不過(guò),由於這個(gè)動(dòng)作會(huì)直接修改到原始的文件,所以請(qǐng)你千萬(wàn)不要隨便拿系統(tǒng)配置來(lái)測(cè)試!
我們還是使用我們的 sedTest.txt來(lái)測(cè)試吧
利用 sed 直接在 sedTest.txt 最后一行加入『# This is a test』
[root@entel2 ~]# sed -i '$a This is for test ' sedTest.txt [root@entel2 ~]# cat sedTest.txt xiao gong jiang1 xiao gong jiang2 xiao gong jiang3 xiao gong jiang4 xiao gong jiang5 xiao gong jiang6 xiao gong jiang7 xiao gong jiang8 xiao gong jiang9 xiao gong jiang10 xiao gong jiang11 xiao gong jiang12 xiao gong jiang13 xiao gong jiang14 xiao gong jiang15 root:x:0:0:root:/root:/bin/bash This is for test由於 $ 代表的是最后一行,而 a 的動(dòng)作是新增,因此該文件最后新增『# This is a test』!
每一行結(jié)尾若為 . 則換成 !
sed -i 's/\.$/\!/g' regular_express.txt在每行的頭添加字符,比如”HEAD”
sed 's/^/HEAD&/g' test.file在每行的行尾添加字符,比如“TAIL”
sed 's/$/&TAIL/g' test.file如果想導(dǎo)出文件,就利用重定向;如果想在原文件上更改,添加選項(xiàng)”-i”。
sed 的『 -i 』選項(xiàng)可以直接修改文件內(nèi)容,這功能非常有幫助!舉例來(lái)說(shuō),如果你有一個(gè) 100 萬(wàn)行的文件,你要在第 100 行加某些文字,此時(shí)使用 vim 可能會(huì)瘋掉!因?yàn)槲募罅?#xff01;那怎辦?就利用 sed 啊!透過(guò) sed 直接修改/取代的功能,你甚至不需要使用 vim 去修訂!
總結(jié)
以上是生活随笔為你收集整理的Linux-sed文本处理流编辑器的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Oracle实例迁移_真实场景实操
- 下一篇: Linux-sort排序