不同的sed版本的命令实现有可能有微改动,但是用法基本不变,这里的事例都是在以下环境中实验:
环境:centos 6.4
sed版本:sed-4.2.1-10.el6.x86_64
sed命令语法格式:
[address] command
address在“sed基本用法一”中已经讲过,这里不再赘述
还有一种写法,因为在脚本程序中不常用,所以在这里只是了解一下即可
address{
command1
command2
....
}
当多条command时要求右大括号必须单独一行,这样大括号中的所有命令都作用于address匹配的内容
另外如果命令之间用分号(;)分隔(或者用sed的-e选项),则可以把多个Sed命令放在同一行。
sed的常用命令有以下几个方面:删除,替换,插入,追加,更改(和替换是不一样的命令),下面逐个讲解
【删除】
命令:[address]d
说明:命令很简单,在address后面直接跟字符d即可
事例:
删除文件中第一行内容
【替换】
命令:[address] s/pattern/replacement/flags
说明:
1,pattern是正则表达式,要匹配替换的地方,红色字符斜杠(/)是定界符,可以用除换行符外的任意字符来做定界符,但是address中的定界符必须用斜杠;
2,replacement是一个字符串,用来替换与pattern匹配的内容,下面三个字符在replacement中有特殊含义:
- & 用正则表达式匹配的内容进行替换(即这个符号表示pattern匹配的内容)
- \n 匹配第n个子串(n表示1到9的数字),这个子串以前在pattern中用“\(”和“\)”指定,称为回调
- \ 转义字符,当在replacement中存在$符号时就可以用"\$"进行转义
3,flags表示替换的标志,可以取以下几个:
- n 1到512之间的一个数字,表示对本模式中指定模式第n次出现的情况进行替换
- g 对模式空间的所有出现进行全局更改。没有g时通常只有第一次出现的情况才会被取代
- p 打印模式空间内容
- w file 将模式空间的内容写到文件file中
事例:
【追加】
命令:[line-address]a text
[line-address]r file
说明:1,追加只能作用于单行内容,在匹配的单行之后增加text的内容
2,a后面可以跟制表符(需要转义斜杠如:tab键要输入\\t而不是\t),这样制表符也会追加到text之前,而 text中的制表符不需要转义
3,r命令后面是跟一个文件名file,这样会把file中的内容追加到下一行中,想追加多行内容时可以使用此方法
(r是read的缩写,读文件内容到模式空间,相应还有w为write的缩写,把模式空间内容写入到文件中)
事例:
【插入】
命令:[line-address]i text
说明:1,插入只能作用于单行内容,在匹配的单行之前插入text的内容
2,i命令后面可以跟制表符(需要转义斜杠如:tab键要输入\\t而不是\t),这样制表符也会追加到text之前,而 text中的制表符不需要转义
事例:
【更改】
命令:[address]c text
说明:1,更改命令可以作用于单行,也可以作用于一个范围的行
2,c命令后面可以跟制表符(需要转义斜杠如:tab键要输入\\t而不是\t),这样制表符也会追加到text之前,而 text中的制表符不需要转义
事例:
最后一个命令中“1,2”就是表示第一行到第2行的一个范围行,把这整个范围行替换成"change more line"
【转换】
命令:[address]y/source/dest/
说明:1,将匹配到的source中的每个字符替换为dest中对应的字符,这也要求source和dest的长度要相等
2,字符的位置可以不用在文件中连续
3,根据前两个说明可以很快写出转换文本大小写的命令(下面命令就是把小写字符转换成相应的大写字符)
[address]y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
事例:
补充事例:
要求:删除一个范围内容中的一条记录
例如:
源文件内容,删除<b>标记块中的<save>这条记录:
itsenlin@itsenlin-Aspire-4750 ~/test $ cat log
<a>
<test>
<save>
</a>
<b>
<test>
<save>
</b>
修改之后的内容如下:
<a>
<test>
<save>
</a>
<b>
<test>
</b>
这个就需要使用到前面提到的"address{command}"的用法了,代码如下:
itsenlin@itsenlin-Aspire-4750 ~/test $ sed '/<b>/,/<\/b>/{ /save/d }' log