sed介紹sed:stream editor是一個行編輯器,或叫流編輯器,每次處理一行,處理完一行再處理下一行。sed並不直接處理源文件,而是讀取一行後放入模式空間(patten space)里,在這個模式空間中完成編輯,並輸出顯示。當然sed加上 –i 參數也可以直接原處理文件。sed不僅有模式空... ...
sed介紹
sed:stream editor
是一個行編輯器,或叫流編輯器,每次處理一行,處理完一行再處理下一行。sed並不直接處理源文件,而是讀取一行後放入模式空間(patten space)里,在這個模式空間中完成編輯,並輸出顯示。當然sed加上 –i 參數也可以直接原處理文件。sed不僅有模式空間,還有一個叫保持空間的概念,模式空間和保持空間的內容可以相互交換,覆蓋,追加等,但是用的較少,用起來也比較燒腦,屬於sed的高級用法。
sed用法
sed [option]… ‘script’ inputfile … …
常用選項:
-n:不輸出模式中的內容到屏幕
-e:多點編輯
-f /path/to/script_file:從指定文件中讀取編輯腳本
-r:支持使用擴展正則表達式
-i:修改原文件
地址定界:
1.不給地址:對全文進行處理
2.單地址:
#:指定的行
/pattern/:被此模式所能匹配到的每一行
3.地址範圍:
#,#:表示從第幾行到第幾行
#,+#:表示第幾行開始後的多少行
/pat1/,/pat2/:表示從匹配到模式1開始到匹配到模式2之間的行
編輯命令:
d:刪除
p:顯示
a \text:在行後面追加文本;支持使用\n實現多行追加
i \text:在行前面插入文本;支持使用\n實現多行插入
c \text:替換行為單行或多行文本
w /path/to/somefile 保存模式空間匹配到的行至指定文件中
r /path/from/somefile:讀取指定文件的文本流至模式空間中匹配到的行的行後
=:為模式空間中的行列印行號
!:取反
s///:替換標記,s///g行內全局替換;支持使用其它分隔符,s@@@,s###
用法舉例:
[root@slave ~]# cat ifcfg-ens33 TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" IPV6INIT="yes" IPV6_AUTOCONF="yes" IPV6_DEFROUTE="yes" IPV6_FAILURE_FATAL="no" IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="3503f57e-dce7-425e-870f-efbc4897bfb2" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.100.20" PREFIX="24" GATEWAY="192.168.100.2" DNS1="114.114.114.114" IPV6_PEERDNS="yes" IPV6_PEERROUTES="yes" IPV6_PRIVACY="no"
1.顯示1到3行的內容
[root@slave ~]# sed -n '1,3p' ifcfg-ens33 TYPE="Ethernet" BOOTPROTO="none"DEFROUTE="yes"
2.刪除第2行至最後一行
[root@slave ~]# sed '2,$d' ifcfg-ens33 TYPE="Ethernet"
3.把192.168.100.20替換成192.168.100.30並只顯示此行
[root@slave ~]# sed -n 's/192.168.100.20/192.168.100.30/;/IPADDR/p' ifcfg-ens33 IPADDR="192.168.100.30"
4.把所有的IPV6換成ipv6
[root@slave ~]# sed -n '1,$ s/IPV6/ipv6/g;/ipv6/p' ifcfg-ens33 ipv6INIT="yes" ipv6_AUTOCONF="yes" ipv6_DEFROUTE="yes" ipv6_FAILURE_FATAL="no" ipv6_ADDR_GEN_MODE="stable-privacy" ipv6_PEERDNS="yes" ipv6_PEERROUTES="yes" ipv6_PRIVACY="no"
5.在第1行之前和第3行後面加入文本“hello sed”,並顯示1到4行
[root@slave ~]# sed -ne '1 i \hello sed\n===============' -e '3 a ===================\n\hello sed' -e '1,4p' ifcfg-ens33 hello sed =============== TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="yes" =================== hello sed IPV4_FAILURE_FATAL="no"
6.刪除包含IPV6的行
[root@slave ~]# sed -e '/.*IPV6.*/d' ifcfg-ens33 TYPE="Ethernet" BOOTPROTO="none" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" NAME="ens33" UUID="3503f57e-dce7-425e-870f-efbc4897bfb2" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.100.20" PREFIX="24" GATEWAY="192.168.100.2" DNS1="114.114.114.114"
7.從文件sedscript讀入sed腳本,要求將BOOTPROTO=”none”改成”static”,註釋掉所有包含IPV6的行,在文件開始和結束行加===sed is a strong tool===,並將網關改成192.168.100.3最後將修改後的內容保存到ifcfg-test文件中
[root@slave sed]# cat sedscript #!/bin/sed -f # this is a sed script 1 i \=== sed is strong tool === s/^IPV6/# IPV6/g s/none/static/ s/192.168.100.2/192.168.100.3/ $ a \=== sed is strong tool === w ifcfg-test
[root@slave sed]# chmod +x sedscript [root@slave sed]# ./sedscript ifcfg-ens33
[root@slave sed]# cat ifcfg-test TYPE="Ethernet" BOOTPROTO="static" DEFROUTE="yes" IPV4_FAILURE_FATAL="no" # IPV6INIT="yes" # IPV6_AUTOCONF="yes" # IPV6_DEFROUTE="yes" # IPV6_FAILURE_FATAL="no" # IPV6_ADDR_GEN_MODE="stable-privacy" NAME="ens33" UUID="3503f57e-dce7-425e-870f-efbc4897bfb2" DEVICE="ens33" ONBOOT="yes" IPADDR="192.168.100.30" PREFIX="24" GATEWAY="192.168.100.3" DNS1="114.114.114.114" # IPV6_PEERDNS="yes" # IPV6_PEERROUTES="yes" # IPV6_PRIVACY="no"上面這個例子中的i和a插入和追加的內容沒有寫入到文件中,但是用重定向的方式可以。