強大的處理文本的工具sed
我們知道,sed被稱為Linux中被稱為文本處理三劍客之一,相比于grep命令匹配內容的功能,sed則能夠做到對匹配到的文本內容對其進行編輯。
Linux文本處理三劍客:
sed:文本編輯工具
awk:Linux上的實現gawk,文本報告生成器(傳送門)
sed,英文全稱Stream EDitor,翻譯過來就是行編輯器。
用法:
sed[option]…’script’ inputfile…
其中‘script’可表示為’地址定界+編輯命令’
option:
-n? 取消默認打印內容到屏幕(示例1)
-e???? 多點編輯,表達且關系,與grep的-e不同,grep -e表達或關系(示例2)
-f????? 從指定文件中讀取編輯腳本(示例3)
-r????? 支持使用擴展正則表達式
-i.bak?????? 原處編輯,并備份文件file.bak(示例4)
地址定界:
(1)不給地址:對全文進行處理
(2)單地址:
#:指定的行,$:最后一行
/pattern/:支持正則表達式,被此模式所能匹配到的每一行
(3)地址范圍:
#,# ? ? ? ? ? ? ? ? ? ? ? ? (示例5)
#,+#
/pat1/,/pat2/ ? ? ? ? ?(示例6)
/pat1/, # ? ? ? ? ? ? ? ? ?(示例7)
(4)~:步進
1~2? 奇數行 ? ? ? ? ? ? ?(示例5)
2~2? 偶數行
編輯命令:
d?????? 刪除模式空間匹配的行(示例4)
p?????? 打印當前模式空間內容,追加到默認輸出之后(示例1)
a[\]text?? 在指定行后面追加文本(示例4)
如要實現插入內容空格開頭可先追加\再輸入空格
支持使用\n實現多行追加(示例8)
i[\]text???? 在指定行前面插入文本(示例9)
c[\]text??? 替換指定行尾單行或多行文本(示例10)
w /path/somefile?? 保存模式匹配的行到指定文件(示例11)
r /path/somefile???? 讀取指定文件的文本匹配的行后(示例12)
注意:w,r后跟文件一定要加空格
可利用此命令定義別名到.bashrc
=?????? 為模式空間中的行打印行號
!??? 取反,!需加載地址定界和編輯命令中間,如’2!d’(示例13)
s///:查找替換,支持使用其他分隔符;s###;s@@@(示例14)
示例
以下我們創建文件test進行示例:
示例1:sed ? ‘1,10p’ /data/test.sed
sed命令默認將文本內容打印到屏幕,由于執行命令p,文本內容被打印了兩遍
sed ?-n ?‘1,10p’ /data/test.sed
sed ? -n選項將取消默認輸出到屏幕,僅顯示p的執行結果
示例2:sed -n -e ‘1p’ ?-e ?‘3p’
顯示第一行和第三行,-e表示且的關系
示例3:sed -n -f sedscripts.txt ?/data/test.sed
將2,5p寫入sedscripts.txt文件,-f選項讀取sedscripts.txt,并執行文件中內容
示例4:sed -i ?‘1,10a#’ ? /data/test.sed
表示在第1至第10行內容后插入#,-i選項直接編輯了test.sed的文本內容
sed -i ?‘/#/d’ ?/data/test.sed
表示將所有帶#的行刪掉并編輯文本
示例5:sed -n ?‘3p’ ? ? 打印第3行內容
sed ?-n ‘2,5p’ ? ? ? ? ? ? ? ?打印第2至第五行
sed ?-n ‘2,+3p’ ? ? ? ? ? ? ?打印第2至第5行
sed ?-n ?‘1~2p’ ? ? ? ? ? ? ?打印奇數行
sed ?-n ?‘2~2p’ ? ? ? ? ? ? ?打印偶數行
示例6:正則定界,表示ifconfig命令輸出中開頭eth2的行,至開頭為lo的行
示例7:正則數字混合定界,表示ifconfig命令輸出中,eth2開頭的行到第12行的內容
示例8:多行插入,將aaa\nbbb插入到每行后面
示例9:sed ?‘1,10i#’ ?/data/test.sed
在每一行上面插入#
示例10:sed ?‘1,5c’ ?/data/test.sed
將test.sed文件中1到5行替換為一個#
示例11:sed ?‘2,5w ?f1’ ?/data/test.sed
將test.sed文件中第2到第5行內容打印到f1文件中
示例12:sed ?‘2,5r ?f1’ ?/data/test.sed
將f1的內容插入到第2至第5行
示例13:sed ?-n ?‘2,5! ?p’ ?/data/test.sed
打印除了第2至第5行的內容
示例14:ifconfig |sed -n “2p”|sed -r “s@.*addr:(.*) Bcast.*@\1@”
利用搜索替代,我們可以將任意段字符串定義成方法,然后表示出整行,再利用后向引用即可取出該字符串。
本文來自投稿,不代表Linux運維部落立場,如若轉載,請注明出處:http://www.www58058.com/96023