sed命令应用详解

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命令一些用法以及其常用选项、子命令的详细解析,讲解过程几乎完全基于作者记忆和个人理解进行,限于作者的经验和理解能力等,疏漏或错误在所难免,朋友们如对课程中内容的讲解有建议或者意见,欢迎给出指点和建议。
【sed命令应用详解】转载于:https://blog.51cto.com/wjw7702/904145

    推荐阅读