sed:stream editor(流編輯器)
工作特性:并不直接處理文本文件本身,處理機制為每當處理一個文件的時候,它會逐行讀取,每次把一行讀取到內存空間中去,而后在模式空間(pattern space)中完成編輯.并把編輯好的結果輸出到屏幕上
功 能:數據替換、刪除、增加、等,數據為關鍵字或者一整行,
模式空間:默認不編輯原文件,僅對模式空間中的數據做處理,處理結束后,把模式空間中的內容輸出到屏幕上。
保持空間:在模式空間中處理一行內容會繼續處理下一行,那么對于處理過的行可能還有其他處理,因此可以先把處理好的數據存放在hold space 中,然后等到全部處理好之后在回到模式空間中。
用法:
sed [OPTION]... script-only-if-no-other-script} [input-file]... script:指明要對指定位置做什么動作 地址定界編輯命令(中間沒有空格)
option:
-n:不輸出模式空間中沒被匹配到的內容,被匹配到的內容根據編輯命令決定是否輸出
從文件中讀取行然后通過模式進行處理,如果不予給定模式相匹配,那么系統默認會將這些不匹配模式的行輸出到屏幕上,n選項的作用就是不顯示此類行,對于能匹配到的行,則通過編輯命令來決定是否輸出(如:d就直接刪除,p為顯示)
– r:支持擴展正則表達式
指定地址定界中使用pattern匹配是使用擴展正則表達式
-e:多個編輯命令對一個文件進行編輯
指定的多個script來處理輸入的文本文件
– f:從文件中讀取編輯命令
從文件中讀取script來處理輸出的文本文件
– i:直接修改原文件
將更改過的內容保存到原文件
地址定界:指定文本地址進行編輯
空地址:全文處理 #:指定文本中的某一行 /pattern/:被模式匹配到的每一行 #,#:從第幾行到第幾行 #,+#:從幾行開始的向下幾行 #,/pattern/:從指定的行到第一次被pattern匹配到的行之間的所有行 1~2:從第一行開始每隔一行 奇數行 2~2:從第二行開始每隔一行 偶數行
編輯命令:對指定的關鍵字或行進行編輯命令處理
d:刪除模式空間中的內容
1.sed 'd' sed.txt //刪除全文 2.sed ‘1d’ sed.txt //刪除第1行 3.sed ‘/^[[:digit:]]/d' sed.txt //刪除以數字開頭的所有行 4.sed '1,5d' sed.txt //刪除第1行到第5行 5.sed '3,+3' sed.txt //刪除第3行及以下的3行(一共刪除了4行) 6.sed '1,/^14/d sed.txt //刪除第1行到第一次匹配到以數字“14”開頭的行之間的所有行 7.sed '1~2d' sed.txt //從第1行開始,每隔1行刪除1行(刪除2、4、6、8……)顯示奇數行 8.sed '2~2d' sed.txt //從第2行開始,每隔1行刪除1行(刪除1、3、5、7……)顯示偶數行
p:打印模式空間中的內容 (顯示被指定的地址定界范圍所框定的內容,而不是模式空間中的所有內容)
1.sed '1,3p' sed //顯示第1行到第三行(原有的文件里的會重復顯示一次,加上匹配到的第1到3行也會顯示) 2.sed -n '1,3p' sed //此時原文件中的行就不會顯示來了(n 為不打印原文件中的行,接著被匹配到的行根據編輯命令來決定動作)
a \test:在指定行后面添加文本行,內容為“\test”,支持使用\n實現多行插入
sed '/^[^[:digit:]]/a \hello world ' sed.txt //給文件中以非數字開頭的所有行的下方添加新行,內容為“hello world”
i \test:在指定行前面插入文本行,內容為“\test",支持使用\n實現多行插入
sed '/^[[:digit:]]/i \hello world ' sed.txt //給文件中以數字開頭的所有行的上方添加新行,內容為“hello world”
c \test:把匹配到的行替換成為此處指定的文本內容"\test"(整行替換)
sed '/^[[:digit:]]/c \hello world' sed.txt //把文件中所有以數字開頭的行內容覆蓋為指定的內容“hello world”
w /path/to/somefile:保存模式空間中匹配到的行至指定文件中
sed ’/^#/w /testdir/#.txt sed.txt //將文件中以#號開頭的行另存到 (/testdir/#.txt)文件中。
s /path/from/somefile:讀取指定文件中的內容到當前模式指定的行后面
sed '1r /etc/issue' sed.txt //將/etc/issue文件中的內容讀取到sed.txt文件中的第1行后面
=:為模式匹配到的行打印行號
sed '/^#/=' sed.txt //給sed.txt文件首行為#號開頭的行在其上方添加行號
?。簵l件取反
sed '/^[[:digit:]]/!d' sed.txt //刪除sed.txt文件中不以數字開頭的行
s/pattern/string/修飾符:查找替換(默認只替換每一行中第一次被模式匹配到的字符串)
將每一行當中能被模式匹配到的字符串替換成string字符串
sed 's@[[:digit:]]@AAA@g' sed //將sed.txt文件中的數字全局替換成為字符”AAA“
其中: 1.“@”符為分割符,可任意更改分隔符,但三個分割符必須為一致
第1個@與第2個@之間的內容為地址定界,(就是我們需要替換的原內容) 第2個@與第3個@之間的內容為轉換內容,(將前面需要替換的內容更改為此處的內容) 第3個@符后面的為修飾符,用于更改系統默認的一些操作
2、history | sed -r 's@^[[:space:]]+@@' //將history列表中的行首為一個空格字符以上字符不顯示(最后兩個@@中間沒有內容,就代表空,就表示把前面的替換成空,就相當于刪除行首的空格字符)
修飾符(替換標記):加修飾符更改默認操作
g:全局替換
系統默認是只操作每一行的首次匹配到的字符,如果一行后面還有符合條件的就不在執行。在最后一個@緊跟g,則表示全局符合條件的都執行操作。
i:查找時忽略字符
當我們在查找某字母時用的是小寫,然則我們要把這些字母轉換為其他的字符或字母,如果我們指定的字母為小寫,那么系統默認只更改小寫字母。
如果加上“ i ”,則不區分大小寫,只要同字母就都執行
w:將替換成功的結果保存到指定的文件中
history | sed -r 's@^[[:space:]]+@#@w sed.txt2' // 將轉換成功的結果保存到sed.txt2文件中
& 已匹配字符串標記(調用之前匹配到的字符串,位置任意)
sed 's/^192.168.0.1/&localhost/' file //
示例:
1、刪除/etc/grub2.conf文件中所有以空白開頭的行行首的空白字符
[root@localhost test]# sed -r 's/^[[:space:]]+//' /etc/grub.conf
2、刪除/etc/fstab文件中所有以#開頭,后面至少跟一個空白字符的行的行首的#和空白字符
sed 's/^#[[:space:]]\+//' /etc/fstab //此刪除符合題目要求 sed -r 's/^(#|#[[:space:]]+)//' /etc/fstab //此命令則刪除#號沒空格的
3、在/root/install.log每一行行首增加#號
sed 's/^/#/' /root/install.log
4、在/etc/fstab文件中不以#開頭的行的行首增加#號
sed 's/^[^#]/#/' fstab
5、處理/etc/fstab路徑,使用sed命令取出其目錄名和基名
基名:echo "/etc/sysconfig/network-scripts/" | sed -r 's@.*/([^/]+)/?@\1@' 目錄:1.echo "/etc/sysconfig/network-scripts/" | sed -r 's@[^/]+/?$@@' 2.echo "/etc/sysconfig/network-scripts/" | sed -r 's@(.*/)[^/]+/?@\1@'
6、利用sed 取出ifconfig命令中本機的IPv4地址
ifconfig | sed '2!d' | sed -r 's@.*inet.addr:(.*)B.*@\1@'
7、統計centos安裝光盤中Package目錄下的所有rpm文件的以.分隔倒數第二個字段的重復次數
ls /mnt/Packages/* | sed -r 's@.*\.(.*)\.rpm$@\1@' | sort | uniq -c
原創文章,作者:Lii,如若轉載,請注明出處:http://www.www58058.com/31654