Linux文本三剑客之sed仗剑走天涯
一,sed是什么?
? sed是Strem Editor(流編輯器)縮寫,是操作、過濾和轉(zhuǎn)換文本內(nèi)容的強(qiáng)大工具。對文件內(nèi)容逐行(行編輯器,一行讀取一次,對行編輯)進(jìn)行處理調(diào)用操作并顯示到STDOUT,常用功能有增刪改查,過濾,取行。
二,sed的工作流程
? (1)sed默認(rèn)不編輯原文件,而是逐行操作處理,把當(dāng)前處理的行存儲在臨時緩存空間,稱為“模式空間”(pattern space)。
? (2)接著在pattern space內(nèi)進(jìn)行模式匹配,即和指定條件做匹配
? ? ? 不滿足模式:輸出到標(biāo)準(zhǔn)輸出STDOUT;
????? 滿足模式:進(jìn)行指定的模式操作,再輸出到STDOUT;
? (3)第二個特殊的緩存空間——“保持空間”:hold space,臨時保存操作在另一處緩存空間;
? (4)當(dāng)執(zhí)行pattern space和 hold space里相關(guān)選項的時候來回進(jìn)行之間的數(shù)據(jù)流編輯操作;
? (5)最后根據(jù)操作執(zhí)行hold space空間操作,選擇性顯示到STDOUT; ?
三,sed的語法格式
?? sed [OPTION]... ?'script' ?[input-file] ...
?? 注意:1.sed和后面的選項之間至少有一個空格。
???? 2.script:指的是AddressCommands(地址定界編輯命令),AddressCommands中間無空格,直接連接為一個選項操作
???? 3.input-file(輸入文件)是可選項,sed還能夠從標(biāo)準(zhǔn)輸入如管道獲取輸入。
四,sed的常用選項和地址定界
?? (1)OPTION常用選項:
-n:不輸出模式空間中的內(nèi)容至屏幕; -e?script,?--expression=script:多點編輯; -f??/PATH/TO/SED_SCRIPT_FILE:每行一個編輯命令; -r,?--regexp-extended:支持使用擴(kuò)展正則表達(dá)式; -i[SUFFIX],?--in-place[=SUFFIX]:直接編輯原文件?;(編輯操作的結(jié)果直接保存在原文件中)?? (2)地址定界:
?? ①空地址:什么都不寫時,表示對全文進(jìn)行處理;
?? ②單地址:
?????? #:指定行;
?????? /pattern/:被此模式所匹配到的每一行;注意:【/ /】是固定模式符號,不能省略
?? ③地址范圍:(#表示任意數(shù)字)
?????? #,#:從某行到某行,第二個#大于第一個#
?????? #,+#:從某行開始到加多少行(3,+8 :第3行向下開始一共8行,包含第三行)
?????? #,/pattern1/:(從指定的行開始到第一次被模式所匹配的行結(jié)束的所有行)
?????? /pattern1/,/pattern2/:從第一次匹配到的模式1到第二次匹配到的模式2
?????? $:最后一行;
?? ④步進(jìn):~,#~#?? 從第幾行
?????? 1~2:所有奇數(shù)行。 ?? 從第一行開始,每次加兩行讀取
?????? 2~2:所有偶數(shù)行。??? 從第二行開始,每次加兩行讀取
五,sed編輯命令
? (1)常用編輯命令:
? d:刪除;
~]#?sed?'1d'?FILE?????????????????#刪除第一行 ~]#?sed??'2,$d'?FILE??????????????#刪除第二行到最后一行? p:列印;顯示模式空間中的內(nèi)容,但默認(rèn)會輸出2次匹配的結(jié)果,因此使用-n取消默認(rèn)輸出;
~]#?sed?-n?'1p'?FILE?????????????#顯示第一行 ~]#?sed?-n?'2,$p'?FILE??????????????#顯示第二行到最后一行? a \text:新增;在行后面追加文本“text”,支持使用\n實現(xiàn)多行追加;?
~]#?sed???'/^test/a\this?is'?FILE????????#將?this?is?追加到以test開頭的行后面 ~]#?sed???'2a\this?is\nis?this'?FILE?????#將?this?is?和?is?this?多行追加第二行后面? i? \text:插入;在行前面插入文本“text”,支持使用\n實現(xiàn)多行插入;
~]#?sed?-i?'5i\this?is'?FILE????????#在文件第5行之前插入this?is? ~]#?sed?-i?'5i\this?is\nis?this'?FILE??#將?this?is?和?is?this?多行插入第5行之前? c \text:按行替換;把匹配到的行替換為此處指定的文本“text”;
~]#?sed??'2c\this?is'?FILE????????????#將文件第二行替換為this?is? w /PATH/TO/SOMEFILE:保存模式空間匹配到的行至指定的文件中;
~]#?sed?-n?'/test/w?file'?example?????#在example中所有包含test的行都被寫入file里? r? /PATH/FROM/SOMEFILE:讀取指定文件的內(nèi)容至當(dāng)前文件被模式匹配到的行后面;文件合并;
~]#?sed???'2r??file'???filename???#將file的內(nèi)容讀進(jìn)來顯示在filename文件第二行后面? =:為模式匹配到的行打印行號;
~]#?sed???'/this?is/='???FILE???????#顯示?this?is?的行號
? !:條件取反;
?? 地址定界!編輯命令;
~]#?sed?'1!d'?FILE?????????#除了第一行全部刪除
? s///:查找替換,其分隔符可自行指定,常用的有s@@@, s###等;
~]#?sed?'s/book/books/'?FILE????????#把每一行中第一處?book?替換成?books?? 替換標(biāo)記:
???? g:全局替換;
~]#?sed?'s/book/books/g'?FILE????????#把每一行中的所有?book?替換成?books ~]#?sed?'s/book/books/3g'?FILE???????#從每一行的第三處開始替換???? w /PATH/TO/SOMEFILE:將替換成功的結(jié)果保存至指定文件中;
???? p:顯示替換成功的行;
~]#?sed?'s/book/books/3gp'?FILE???????#顯示替換成功的行
? 練習(xí):
? 1.刪除text9文件中所有以空白字符開頭的行的行首的所有空白字符;
~]#?sed?'s@^[[:space:]]\+@@'?text9??
? 2.刪除text9文件中所有以#開頭的行的行首的#號及#后面的所有空白字符;
~]#?sed??'s@^#[[:space:]]*@@'?text9??
? 3.輸出一個絕對路徑給sed命令,取出其目錄,其行為類似于dirname;
~]#?echo?"/var/log/messages/"?|?sed?'s@[^/]\+/\?$@@' ~]#?echo?"/var/log/messages"?|?sed?-r?'s@[^/]+/?$@@'??
? (2)高級編輯命令:
?? h:把模式空間中的內(nèi)容覆蓋至保持空間中;
?? H:把模式空間中的內(nèi)容追加至保持空間中;
?? g:把保持空間中的內(nèi)容覆蓋至模式空間中;
?? G:把保持空間中的內(nèi)容追加至模式空間中;
?? P:打印多行匹配空間的第一行。
?? 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:刪除原有的所有空白行,而后為所有的非空白行后添加一個空白行;
?? sed? 'n;d'? FILE:顯示奇數(shù)行;
?? sed 'G' FILE:在原有的每行后方添加一個空白行
六,實戰(zhàn)案例
?? 1.變量替換
? ?
?? 2.分組替換\( \)和\1的用法:
?? \( \)的功能可以記住正則表達(dá)式的一部分,其中,\1為第一個記住的模式即第一個小括號中的匹配內(nèi)容,\2第二記住的模式,即第二個小括號中的匹配內(nèi)容,sed最多可以記住9個。
?? 
?? ①^.*am–>這句的意思是以任意字符開頭到am為止,匹配文件中的I am字符串;
?? ②\([a-z].*\)–>這句的外殼就是括號\(\),[a-z].*合起來就是匹配任意多個字符,因為ood字符串是我們需要的,因此用括號括起來匹配,后面通過\1來取good字符串;
?? ③ b.*$–>表示以空格b起始,任意字符結(jié)尾,實際就是匹配good字符串后,緊接著的字符串 boy.;
?? ④sed默認(rèn)識別基本正則表達(dá)式,sed加上-r選項則可以使用擴(kuò)展正則表達(dá)式。
?? 3.特殊符號 & 代表被替換的內(nèi)容
?? 將text9前三行中 b 改成 --b--
~]#?sed?'1,3s#b#--&--#g'?text9??
?? 4.打印奇偶行
?? 打印奇數(shù)行:
~]#?sed?-n?'1~2p'?text9 ~]#?sed?-n?'p;n'?text9??
?? 打印偶數(shù)行:
~]#?sed?-n?'n;p'?text9 ~]#?sed?-n?'2~2p'?text9?? 
?? 5.獲取本機(jī)IP地址
~]#?ifconfig?|?sed?-n?'2p'?|?sed?'s/^.*inet//g'?|?sed?'s/netmask.*$//g'??
?? 6.將text9中偶數(shù)行末尾替換成 --w ;
sed?'2~2s#$#--w#'?text9 sed?'n;s#$#--w#'?text9 sed?'1~2!s#$#--w#'?text9??
轉(zhuǎn)載于:https://blog.51cto.com/wqiang/1753180
總結(jié)
以上是生活随笔為你收集整理的Linux文本三剑客之sed仗剑走天涯的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 第三次作业(二)
- 下一篇: 2.4-虚拟磁盘恢复虚拟机
