sed命令是流式编辑器(Stream EDitor)或行编辑器,工作在模式空间(pattern space),不操作源文件,只是把处理结果返回到屏幕上来,对源文件没有任何损害,sed命令默认支持正则表达式,也可以使用sed -r选项支持扩展正则表达式;
1、sed 的使用格式:
sed [options] ‘script’ input_file...
script指的是sed的脚本,input_file是被处理的文件;
sed [options] -f script_file input_file...
-f用来指定一个文件script_file(脚本文件);
sed ‘ADDR1,ADDR2command’ input_file 对起始行和结尾行进行处理;
sed ‘/PARTTERN/command’ input_file (PARTTERN指的是模式,只有模式
匹配到的行才执行命令;
sed ‘/PATTERN1/,/PATTERN2/’ input_file 表示从PATTERN1的第一个字符
开始到PATTERN2第一个字符结尾;
2、sed 选项:
sed -i 直接操作源文件;
sed -n 静默模式,表示只显示处理以后的内容;
sed -r 使用扩展正则表达式;
sed -e 多点编辑,执行多个脚本,可以使用多个-e选项,或者使用一个-e选
项,后面的脚本用分号隔开;
3、sed 的子命令:
d 删除指定行;
p 模式空间中的文本在处理之前,每一次都会先显示;
! 对命令取反;
a \ 在模式匹配到的行后面添加新内容;
i \ 在模式匹配到的行前面添加新内容;
r FILE 读取FILE文件并且把FILE文件添加到某个文件中的某个特定位置;
w FILE 把FILE文件中模式能够匹配到的所有的行保存到另一个文件中;
y /string1/string2/ 把string1替换成string2;
s /patren/string/表示把patren匹配出来的内容替换为string(其中的“/”
有其特殊含义,所以使用时要注意转意,实际上可以替换为其它的无特殊
意义的字符,下面举例我们将用@符号替换);
g 全局的,找到所有的匹配字符,如果不加的话只匹配第一次出现的内容;
i 做模式匹配忽略大小写;
& 引用其前面的所有字符;
n 下一行;模式空间中的文本在处理之前,每一次都会先显示;
N 追加到下一行,sed命令每次读取一行,当第一行读取后会放到模式空间中
不处理然后接着读取第二行,读取完后将这两行一块处理,往下以此类推;
h 将模式空间的内容以覆盖的方式复制到保留空间;
H 将模式空间的内容以追加的方式复制到保留空间;
g 将保留空间的内容以覆盖的方式复制到模式空间;
G 将保留空间的内容以追加的方式复制到模式空间;
b 跳转,略过符合模式的行;
b label :label字符的长度不能超过7个;跳转到什么位置,其中的label是固
定字符;
x 保留空间和模式空间对调;
t label 测试:前面的s命令执行成功了就跳转到标记位置;
= 为每一行标记行号;
一、下面来详细讲解一下常用的命令或选项的用法及示例:
d 删除指定行;
sed -i 选项会直接操作源文件,一定要慎用;
! 对命令取反,仍以fstab文件为例:
p 模式空间中的文本在处理之前,每一次都会先显示,也就是说每一行将会被显示
两次,以fstab文件为例:
sed -n 选项为静默模式,表示只显示处理以后的内容,处理以前的内容将不会被
显示出来;仍以fstab文件为例;
sed ‘/PARTTERN/command’input_file (PARTTERN指的是模式,只有模式匹
配到的行才执行命令,其中的模式同时支持grep的各种元字符;这里以脚本a.sh
为例,删除以#开头的行:
i \ 在模式匹配到的行前面添加新内容,与a \正好是相反的结果;
a \ 在模式匹配到的行后面添加新内容;这里以脚本a.sh为例,在以包含#号的行
的后面添加一些内容:
同时也可以利用\n实现添加多行,仍以a.sh为例,我们在上述的基础上再在后面添加一行内容:
r FILE 读取FILE文件并且把FILE文件添加到某个文件中的某个特定位置;这里以
fstab和a.sh脚本文件为例,将fstab文件里的内容添加到a.sh脚本文件中
的第二行后面:
w FILE 把FILE文件中模式能够匹配到的所有的行保存到另一个文件中;
示例:把a.sh脚本文件中包含大写字母的行保存到/tmp/file.out这个文件中,
注意w命令执行时也会将模式空间中的文本在处理之前,每一次都会先显
示,所以执行时我们加上sed的-n选项;
s /patren/string/表示把patren匹配出来的内容替换为string(其中的“/”有
其特殊含义,所以使用时要注意转意,实际上可以替换为其它的无特殊意义 的
字符,下面举例我们将用@符号替换);
g 全局的,找到所有的匹配字符,如果不加的话只匹配第一次出现的内容;
i 做模式匹配忽略大小写;
& 引用其前面的所有字符;
n 下一行;模式空间中的文本在处理之前,每一次都会先显示;
示例:以test1文本文件为例,我们查找文本中的每一行末尾的love、like,然后将它们替换成lover和liker:
查找文本中的每一行中的love,然后将它替换成lover;
查找文本中所有的love和like,并将它们替换成lover和liker:
查找文本中his、her并将它们替换成His、Her:
sed -e 多点编辑,执行多个脚本,多点编辑,执行多个脚本,可以使用多个-e选
项,或者使用一个-e选项,后面的脚本用分号隔开;仍以test1为例,查找文本
中的每一行末尾的love、like,然后将它们替换成lover和liker,同时查找文
本中his、her并将它们替换成His、Her:
N 追加到下一行,sed命令每次读取一行,当第一行读取后会放到模式空间中不处理
然后接着读取第二行,读取完后将这两行一块处理,往下以此类推;
h 将模式空间的内容以覆盖的方式复制到保留空间;
H 将模式空间的内容以追加的方式复制到保留空间;
g 将保留空间的内容以覆盖的方式复制到模式空间;
G 将保留空间的内容以追加的方式复制到模式空间;
注:保留空间默认是空的,即相当于空白行;
b 跳转,略过符合模式的行;
b label :label字符的长度不能超过7个;跳转到什么位置,其中的label是固定字
符;
y /string1/string2/ 把string1替换成string2;
二、总结:
以上就是sed命令一些用法以及其常用选项、子命令的详细解析,讲解过程几乎完全基于作者记忆和个人理解进行,限于作者的经验和理解能力等,疏漏或错误在所难免,朋友们如对课程中内容的讲解有建议或者意见,欢迎给出指点和建议。