sed用法說明,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:支援使用擴充Regex
-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 sedIPV4_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 script1 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-testTYPE="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插入和追加的內容沒有寫入到檔案中,但是用重新導向的方式可以。