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]# 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插入和追加的内容没有写入到文件中,但是用重定向的方式可以。

上一篇:redis介绍。


下一篇:UVA - 10003 Cutting Sticks(切木棍)(dp)