sed的简单用法
????sed是一個(gè)文本流編輯器,行編輯器,通常用來處理一行文本。通常是把源文件復(fù)制一份,在內(nèi)存中進(jìn)行編輯操作。
????
?????sed每次工作時(shí),是從源文件中復(fù)制出一行,放在自己專用的工作車間,稱為模式空間(pattern space),經(jīng)過處理之后,將會(huì)送到標(biāo)準(zhǔn)輸出(stdout)。默認(rèn)條件下,sed可以處理文本的所有行,但是我們也可以讓sed只處理符合條件的行,比如利用正則表達(dá)式進(jìn)行文版過濾。即sed將行取到模式空間之后,首先要看取出的行是否是sed要關(guān)注匹配的到行,即是否跟要給定的模式匹配到的行,然后才進(jìn)行編輯操作。然后再進(jìn)行edit,再輸出到標(biāo)準(zhǔn)輸出。如果沒有被給定的模式匹配到,那么就不做編輯,直接輸出到標(biāo)準(zhǔn)輸出。
????sed內(nèi)存內(nèi)部還有一部分內(nèi)存空間,稱為保持空間,即hold pace。如果讓模式空間跟保持空間的內(nèi)容互相交換,就可以實(shí)現(xiàn)很多高大上的功能。
????sed使用的基本格式:
????sed [options] ... 'scripts' inputfile...(省略號(hào)意味著可以依次處理多行文本)
其中scripts主要包含兩部分:
????1.地址定界:確定文本處理的范圍;地址定界后+編輯命令
????????(1) 不給地址,空地址:對(duì)全文進(jìn)行處理;
????? ?(2) 單地址:
????????????????#:一個(gè)數(shù)字,指定行;
????????????????/pattern/:被此模式所匹配到的每一行;
????????(3) 地址范圍
????????????????#,#:
????????????????#,+#:
????????????????#,/pat1/ 斜線必須要有
????????????????/pat1/,/pat2/
????????????????$:最后一行;
????????(4) 步進(jìn):~
????????????1~2:所有奇數(shù)行
????????????2~2:所有偶數(shù)行
????2.編輯命令
????????d:刪除;
????????p:顯示模式空間中的內(nèi)容;被地址框定的行;
????????a ?\text:在行后面追加文本“text”,支持使用\n實(shí)現(xiàn)多行追加;
????????i ?\text:在行前面插入文本“text”,支持使用\n實(shí)現(xiàn)多行插入;
????????c ?\text:把匹配到的行替換為此處指定的文本“text”;整行替換,而不是某個(gè)字符;
????????w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
????????r ?/PATH/FROM/SOMEFILE:讀取指定文件的內(nèi)容至當(dāng)前文件被模式匹配到的行后面;文件合并;
????????=:為模式匹配到的行打印行號(hào);
????????!:條件取反;
????????????地址定界!編輯命令; ?放在命令之前;
????????s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
????????????替換標(biāo)記
????????????????g:全局替換;
????????????????w /PATH/TO/SOMEFILE:將替換成功的結(jié)果保存至指定文件中;
????????????????p:顯示替換成功的行;
????3.option
????? 常用選項(xiàng):
????????-n:不輸出模式空間中的內(nèi)容至屏幕;
????????-e script, --expression=script:多點(diǎn)編輯,在一個(gè)sed中可以指定多個(gè)編輯腳本
????????-f ?/PATH/TO/SED_SCRIPT_FILE;每行一個(gè)編輯命令;
????????-r, --regexp-extended:支持使用擴(kuò)展正則表達(dá)式;
????????-i[SUFFIX], --in-place[=SUFFIX]:直接編輯原文件 ;較危險(xiǎn);
????????
????#示例,刪除fstab中第1行至第五行:1,5表示1到5行,d表示刪除;? ?????
[root@wangxin?tmp]#?cat?fstab?# #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0 [root@wangxin?tmp]#?sed?'1,5d'?fstab? #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0##刪除"#"開頭的所有行? ,d表示刪除; ?
[root@wangxin?tmp]#?sed?'/^#/d'?fstab?UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0###顯示fstab的偶數(shù)行,d表示刪除‘1~2’的行,即奇數(shù)行
[root@wangxin?tmp]#?sed?'1~2d'?fstab? # #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' # UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0####fatab的奇數(shù)行顯示兩遍,因?yàn)闊o-n參數(shù),即把模式空間與模式空間處理之后的情況全部顯示出來。
[root@wangxin?tmp]#?sed?'1~2p'?fstab?# #?/etc/fstab #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0#僅顯示奇數(shù)行,要加-n參數(shù),禁止模式空間中的內(nèi)容顯示
[root@wangxin?tmp]#?sed?-n?'1~2p'?fstab?#?/etc/fstab # #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0#在第三行前面插入“new line”字符,添加插入在行之前,用i;
[root@wangxin?tmp]#?sed?'3i?new?line'?fstab?# new?line #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0##在第三行前面插入“new line” 及“another”多行增加用 \n
[root@wangxin?tmp]#?sed?'3i?\new?line\nanother'?fstab?# new?line another #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0###在所有以UUID開頭的行的前面添加“add new delice”的注釋,a表示添加在符合的行之后;
[root@wangxin?tmp]#?sed?'/^UUID/a?\#?add?new?delice?'?fstab?# #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 #?add?new?delice? UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 #?add?new?delice? UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 #?add?new?delice? UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0 #?add?new?delice#把所有以UUID開頭的行替換為“add new delice”,c表示替換;
[root@wangxin?tmp]#?sed?'/^UUID/c?\#?add?new?delice?'?fstab?# #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # #?add?new?delice? #?add?new?delice? #?add?new?delice? #?add?new?delice#顯示所有非#開頭的行,p表示打印顯示
#將所有非#開頭的行寫到/root/fstab.new文件,使用w
#取/etc/issue的內(nèi)容合并到/etc/fatab的第8行上面,r表示將內(nèi)容合并;
[root@wangxin?tmp]#?sed?'8r?/etc/issue'?/etc/fstab# #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # \S Kernel?\r?on?an?\mMage?Education?Learning?Services http://www.magedu.comUUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0#在所有的UUID開頭的行前面都添加一個(gè)/etc/issue的內(nèi)容,r表示將內(nèi)容合并;
[root@wangxin?tmp]#?sed?'/^UUID/r?/etc/issue'?/etc/fstab# #?/etc/fstab #?Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015 # #?Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' #?See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info # UUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 \S Kernel?\r?on?an?\mMage?Education?Learning?Services http://www.magedu.comUUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 \S Kernel?\r?on?an?\mMage?Education?Learning?Services http://www.magedu.comUUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 \S Kernel?\r?on?an?\mMage?Education?Learning?Services##為每一個(gè)UUID開頭的行添加行號(hào),=添加行號(hào)
#刪除所有非#的行,!取非,放在命令d之前
#刪除/boot/grub/grub2.cfg文件中所有以空白字符開頭的行的行首的所有空白字符;s之前空格表示全局;
[root@wangxin?tmp]#?sed??'?s@^[[:space:]]\+@@'?/etc/grub2.cfg? # #?DO?NOT?EDIT?THIS?FILE # #?It?is?automatically?generated?by?grub2-mkconfig?using?templates #?from?/etc/grub.d?and?settings?from?/etc/default/grub ####?BEGIN?/etc/grub.d/00_header?### set?pager=1if?[?-s?$prefix/grubenv?];?then load_env fi if?[?"${next_entry}"?]?;?then set?default="${next_entry}" set?next_entry= save_env?next_entry set?boot_once=true else#刪除/etc/fstab文件中所有以#開頭的行的行首的#號(hào)及#后面的所有空白字符;
[root@wangxin?tmp]#?sed?'?s@^#[[:space:]]*@@'?/etc/fstab?/etc/fstab Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?infoUUID=385ac324-78fe-4c44-9727-a12e14996ab4?/???????????????????????xfs?????defaults????????0?0 UUID=b585757f-8cb2-49e7-add1-e5abae66357b?/boot???????????????????xfs?????defaults????????0?0 UUID=e9e329ef-8661-48ff-8c8c-8bba952402c6?/usr????????????????????xfs?????defaults????????0?0 UUID=1bbc2e62-42d1-44c6-8ce8-7e8df4e56190?swap????????????????????swap????defaults????????0?0#刪除/etc/fstab文件中所有以#開頭的行的行首的#號(hào)及#后面的所有空白字符;并且將UUID的行刪除;
使用-e多點(diǎn)編輯;
[root@wangxin?tmp]#?sed??-e??'s@^#[[:space:]]*@@'???-e??'/^UUID/d'??/etc/fstab/etc/fstab Created?by?anaconda?on?Sun?Dec??6?21:32:10?2015Accessible?filesystems,?by?reference,?are?maintained?under?'/dev/disk' See?man?pages?fstab(5),?findfs(8),?mount(8)?and/or?blkid(8)?for?more?info#輸出一個(gè)絕對(duì)路徑給sed命令,取出其目錄,其行為類似于dirname;將行尾的非/字符替換為空即可,注意錨定行尾,至少出現(xiàn)一次,同時(shí)為了避免尾末有斜,在加一個(gè)\/?表示可有可無,\表示轉(zhuǎn)義;
[root@wangxin?tmp]#?echo?"/opt/soft/Heartbeat-3.0.5.tar.bz2"?|?sed?'?s@[^/]\+/\?$@@' /opt/soft/或者
echo?"/opt/soft/Heartbeat-3.0.5.tar.bz2"?|?sed?-r?'?s@[^/]+/?$@@' /opt/soft/下面的高級(jí)命令需要腦洞大開。
高級(jí)編輯命令:
????h:把模式空間中的內(nèi)容覆蓋至保持空間中;
????H:把模式空間中的內(nèi)容追加至保持空間中;
????g:把保持空間中的內(nèi)容覆蓋至模式空間中;
????G:把保持空間中的內(nèi)容追加至模式空間中;
????x:把模式空間中的內(nèi)容與保持空間中的內(nèi)容互換;
????n:覆蓋讀取匹配到的行的下一行至模式空間中;
????N:追加讀取匹配到的行的下一行至模式空間中;
????d:刪除模式空間中的行;
????D:刪除多行模式空間中的所有行;
示例:
????
????sed ?-n ?'n;p' ?FILE:顯示偶數(shù)行;
????sed ?'1!G;h;$!d' ?FILE:逆序顯示文件的內(nèi)容;
????sed ?’$!d' ?FILE:取出最后一行;
????sed ?'$!N;$!D' FILE:取出文件后兩行;
????sed '/^$/d;G' FILE:刪除原有的所有空白行,而后為所有的非空白行后添加一個(gè)空白行;
????sed ?'n;d' ?FILE:顯示奇數(shù)行;
????sed 'G' FILE:在原有的每行后方添加一個(gè)空白行;
以上為sed的基本用法。
轉(zhuǎn)載于:https://blog.51cto.com/niefeifly/1728848
總結(jié)
- 上一篇: excel自动生成目录
- 下一篇: 为什么你喜欢的女生不喜欢你