Sed 可以对几十个配置文件做统一修改(比如:过滤与替换)
Sed通过一次仅读取一行内容来对某些指令进行处理后输出,所以Sed更适合处理大数据文件
Sed通过文件或管道读取文件内容,对源文件不做更改,将读入的内容复制到缓冲区中(叫模式空间patter space),然后根据相应的指令对模式空间中的内容进行处理
并输出到标准输出(屏幕)
Sed从文件中读取数据,如果没有输入文件,则默认对标准输入进程进行处理
Sed语法格式:
用法:sed [选项].... {脚本指令} [输入文件]....
Sed 参数:
Sed --version 显示sed版本
-n,--quiet,--silent 静默输出,默认情况下,sed程序在所有的脚本指令执行完毕后,将自动打印模式空间的内容,该选项可以屏蔽自动打印
-e script 允许多个脚本指令被执行
-f script-file 从文件中读取脚本指令,对编写自动脚本程序很实用
-i,--in-place 慎用,该选项将直接修改源文件。
-l N 该选项指定l指令可以输出的行长度,l指令为输出非打印字符
--posix 禁用GNU sed 扩展功能。
-r 在脚本指令中使用扩展正则表达式
-s,--separate 默认情况下,sed将把输入的多个文件名作为一个长的连续的输入流,而GNU sed则允许把它们当做单独的文件。
-u,--unbuffered 最低限度的缓存输入与输出
Sed脚本指令基本格式:
[地址] 脚本指令
地址及时操作对象、行数,也可以是正则表达式
脚本指令也可以用花括号进行组合,是命令序列可以作用于同一个地址
address {
command1
command2
command3
}
注意:第一个命令可以和左花括号在同一行,单右花括号必须单独处于一行,此外,命令后添加空格会产生错误
sed操作地址匹配范例
如果不指定操作范围,则默认对文件的所有行操作
sed ‘d’ test 将删除文件的所有行, ‘2d’仅删除第二行
number 指定输入文件的唯一行号
first-step 指定以first开始,并指定操作步长为step,如1、2指定第一行、第三行、第五行......为操作地址。2~5指定第二行开始每5行匹配一次操作地址
sed -n ‘1~2p’ test.txt #打印文件的奇数行
$ 匹配文件的最后一行
/regexp/ //中间包含的是正则表达式,通过正则表达式匹配操作地址。如果//中正则表达式为空,匹配最近一次正则表达式的匹配地址,后面会有范例
\cregexpc \c 与c之间匹配扩展正则表达式,c字符可以使用任意字符替代
addr1,addr2 匹配从操作地址1到操作地址2的所有行
sed ‘2,8d’ test.txt #删除2~8之间的所有行
addr1,+N 匹配地址1以及后面的N行内容
常用脚本指令:
a append 追加 i insert 插入
s substitution 替换 d delete 删除
c 更改 l 打印(显示非打印字符)
y 按字符转换 L 打印(不显示非打印字符)
p 打印 r 读入文件内容
w 保存至文件 q 退出
sed '2a TYPE=Ethernet' test.txt #在第二行后追加TYPE=Ethernet
sed '3i TYPE=Ethernet' test.txt #在第三行前插入TYPE=Ethernet
sed ‘s/yes/no/g ’ test.txt #将文件所有yes替换为no
sed ‘3,4d’ test.txt #删除第3、4行的内容
不确定的操作对象 用 正则表达式来匹配
sed ‘/ONBOOT/a TYPE=Ethernet ’ test.txt
sed '/^GATEWAY/d' test.txt
脚本指令也可以写在脚本里,然后调用这些指令
cat sed.sh
sed -f sed.sh test.txt
执行多个指令的方法:
sed ‘s/yes/no/;s/static/dhcp/’ test.txt #用分号隔开指令
sed -e 's/yes/no' -e 's/static/dhcp' test.txt #使用-e参数
替换指令:s
格式:[address]s/pattern/replacement/flags
Flags标记可以是:n 1~512之间,把指定模式出现第n次进行替换
g 对模式空间的所有匹配进行全局更改,没有g,在只第一次匹配被替换,如一行中有3个A,则仅替换第一个A。
P 打印模式空间的内容
w file 将模式空间的内容写到文件file中
replacement为字符串,用来替换与正则表达式匹配的内容,在replacement部分下,下列字符有特殊含义
& 用正则表达式匹配的内容进行 替换
\n 匹配第n个字串,该字串之前在pattern中用\(\)指定
\ 转义(转义部分包含:、&、\等)
列子:将test.sh文件中第二个<body>替换为</body>
[root@centos6 ~]cat test.sh
<html>
<title>First web </title>
<body>Hello the world! <body>
<html>
[root@centos6 ~]cat sed.sh
/body/{
s/ / \ /body/2
}
[root@centos6 ~]sed -f sed.sh test.sh
[root@centos6 ~]cat test.sh
h1Helloh1
h2Helloh2
h3Helloh3
给所有第一个的h1,h2等添加<>;第二个h1,h2添加</>.
[root@centos6 ~]cat sed.sh
/h[0-9]/{
s//\ <&\</1
s//\<\/&\</2
}
[root@centos6 ~]sed -f sed.sh test.sh
"s///"命令的另一个妙处是:可以把“/”分隔符指定为其它的分隔符
sed -e 's:/usr/local:/usr/:g' test.txt
此时:为替换分隔符 sed会将/usr/local替换为/usr
d指令
用于删除匹配到的行,删除指令还会改变sed命令的执行循序,要删除除匹配的内容,可以使用替换。
c指令
将包含ONBOOT行的内容更改为ONBOOT=yes
sed '/ONBOOT/c ONBOOT=yes' test.txt
y指令
按字符转换(tranform)语法格式为:[address]y/source-chars/dest-chars/
其中,[address]用来定位需要修改的行,source-chars为需要被修改的字符,dest-chars为准备替换的字符
将匹配到/netmask/的那一行小写转换大写
sed '/netmask/y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/ ' test.txt
p指令
显示第一第二行的内容:打印(p),作用类似于l(列印),但是不显示字符,一般与-n配合使用,
sed -n ‘1,2p’ test.txt
l指令
列印(l)显示模式空间中的内容,显示非打印字符,一般与-n一起使用,否则会输出两次
sed -n ‘1,2l’ test.txt
需要n屏蔽自动输出
DEVICE=eth0$
ONBOOT=YES$
r指令
[root@centos6 ~] cat name.txt
Jacob
Tom
Jerry
[root@centos6 ~] cat mail.txt
jacob@gmial.com
tom@gmail.com
jerry@gmail.com
先读取name.txt文件内容,再读取mail.txt文件内容
[root@centos6 ~] cat sed.sh
/.*/{
$r mail.txt
}
[root@centos6 ~] sed -f sed.sh name.txt
Jacob
Tom
jerry
jacob@gmail.com
tom@gmail.com
jerry@gmail.com
q指令
显示 test.txt内容的前两行内容后退出sed指令
sed ‘2q’ test.txt
Sed高级应用
sed 处理流程:
读取文档的一行至模式空间,执行相应的sed指令,完成后输出改行并清空模式空间,依次循环读入文档下一行,直至文档数据结尾
多行操作Nest(N)
通过读取新的输入行,并将它追加至模式空间的现有内容之后,来创建多行模式空间,最初内容与新输入内容\n分隔
[root@centos6 ~] cat test.txt
name:zhangsan
mail:zhangsan@gmial.com
name:lisi
mail:lisi@gmail.com
[root@centos6 ~] sed -n ‘/name/N;L’ test.txt
name:zhangsan mail:zhangsan@gmail.com
name:lisi mail:lisi@gmail.com
多行操作Print(P)
多行打印P:仅输出多行模式中的第一部分,直到第一个插入的\n换行符为止。打印p打印时 \n看作是回车换行
[root@centos6 ~] cat test.txt
aaa
bbb
ccc
ddd
eee
f f f
多行删除操作Delete(D)
多行删除D:将删除模式空间中直到第一个插入的换行符\n前的这部分,并返回sed脚本的顶端,使得剩余指令继续应于模式空间中剩余的内容
删除指令d:删除模式空间中的内容并读入新的输入行,d后面还有多条指令将不在执行,而是返回第一条指令对新读入行进行处理
保持空间Hold(h,H),Get(g,G)
模式空间是存放当前输入行的缓冲区,sed还有一个保持空间(hold space)的缓冲区
模式空间的内容可以复制到保持空间,保持空间的内容可以复制到模式空间
Hold(h/H) 将模式空间的内容复制或追加到保持空间
Get (g/G) 将保持空间的内容复制或追加到保持空间
Exchange(X) 交换保持空间与模式空间的内容
[root@centos6 ~] cat test.txt
aaa
bbb
ccc
ddd
[root@centos6 ~] sed -e '/aaa/h' -e '/aaa/d' -e '/ccc/G' test.txt
bbb
ccc
aaa
ddd