sed是一个飞交互式文本编辑器
sed只对缓冲区中原始文件的副本进行编辑,并不编辑原始的文件
调用sed的方法:
①在Shell命令行输入命令调用sed,格式为:
sed [选项] 'sed命令' 输入文件
②将sed命令插入脚本文件后,然后通过sed命令调用它,格式为:
sed [选项] -f sed脚本文件 输入文件
③将sed命令插入脚本文件后,最常用的方法是设置该脚本文件为可执行,然后直接执行该脚本文件,格式为:
./sed 脚本文件 输入文件
第③种方式的sed脚本文件与第②种有所不同,其sed脚本文件需要以sha-bang(#!)符号开头,sha-bang后面是解析这个脚本的程序名。
sed的常用选项及其意义
选 项 | 意 义 | 示 例 | |
-n | 不打印所有行到标准输出 | 见 n.1 n.2 n.3 | |
-e | 表示将下一个字符串解析为sed编辑命令,如果只传递一个编辑命令给sed,-e选项可以省略 | [root@localhost ~]# sed -n -e '/Certificate/p' -e '/Certificate/=' input | |
-f | 表示正在调用sed脚本文件 | [root@localhost ~]# vim append.sed [root@localhost ~]# chmod u+x append.sed[root@localhost ~]# ./append.sed input |
sed命令通常由定位问本行和sed编辑命令两部分组成
sed命令定位文本的方法
选 项 | 意 义 | 示 例 |
x | x为指定行号 | n.1 [root@localhost ~]# sed -n '1p' input |
x,y | 指定从x到y的行号范围 | n.2 [root@localhost ~]# sed -n '3,6p' input |
/pattern/ | 查询包含模式的行 | n.3 [root@localhost ~]# sed -n '/certificate/p' input |
/pattern/pattern/ | 查询包含两个模式的行 | |
/pattern/,x | 从与pattern的匹配行到x号行之间的行 | [root@localhost ~]# sed -n '/seugrid/,$p' input |
x,/pattern/ | 从x号行到与pattern的匹配行之间的行 | [root@localhost ~]# sed -n '3,/seugeid/p' input |
x,y! | 查询不包括x和y行号的行 | [root@localhost ~]# sed -n '2,10!p' input |
sed编辑命令
选 项 | 意 义 | 示 例 |
p | 打印匹配行 | [root@localhost ~]# sed -n '/Certificate/p' input |
= | 打印文件行号 | [root@localhost ~]# sed -n '/Certificate/=' input |
a\ | 在定位行号之后追加文本信息 | [root@localhost ~]# sed '/file:/a\We append a new line.' input |
i\ | 在定位行号之前插入文本信息 | [root@localhost ~]# vim insert.sed [root@localhost ~]# chmod u+x insert.sed[root@localhost ~]# ./insert.sed input |
d | 删除定位行 | [root@localhost ~]# sed '1d' input #删除第一行 [root@localhost ~]# sed '$d' input #删除最后一行 [root@localhost ~]# sed '1,10d' input #删除第1~10行 [root@localhost ~]# vim delete.sed [root@localhost ~]# chmod u+x delete.sed[root@localhost ~]# ./delete.sed input |
c\ | 用新文本替换定位文本 | [root@localhost ~]# vim modify.sed [root@localhost ~]# chmod u+x modify.sed[root@localhost ~]# ./modify.sed input |
s | 使用替换模式替换相应模式 | [root@localhost ~]# sed 's/Certificate/CERTIFICATE/' input [root@localhost ~]# sed -n 's/Certificate/CERTIFICATE/p' input #-n和-p选项结合使用,只打印替换行 [root@localhost ~]# sed -n 's/Certificate/CERTIFICATE/' input #少了p选项,不打印任何内容 [root@localhost ~]# sed -n 's/seu/njue/p' input #不带g选项的结果 [root@localhost ~]# sed -n 's/seu/njue/' input #带g选项的结果 [root@localhost ~]# sed -n 's/seu/njue/2p' input #sed替换第n次匹配 [root@localhost ~]# sed -n 's/seu/njue/w outpout' input #将sed字符串改为njue,并将结果写入output文件 [root@localhost ~]# sed -n 's/seu/(&)/pg' input #&表示了seu |
r | 从另一个文件中读文本 | [root@localhost ~]# vim otherfile [root@localhost ~]# sed '/Certificate/r otherfile' input #在与Certificate匹配的行后读入otherfile文件 |
w | 将文本写入到一个文件 | [root@localhost ~]# sed -n '1,5 w output' input #将1~5行写入output文件 [root@localhost ~]# sed -n '/globus/w output' input #将与goobus关键字匹配的行写入output文件 |
y | 交换字符 | [root@localhost ~]# sed 'y/fmj/FMJ/' input |
q | 第一个模式匹配完成后退出 | [root@localhost ~]# sed '5 q' input #打印前5行,然后退出 [root@localhost ~]# sed '/.r.*/q' input #匹配第1个字符串后立即退出 |
l | 显示与八进制ASCII码等价的控制字符 | [root@localhost ~]# sed -n '1,$l' control |
{} | 在定位行执行的命令组 | [root@localhost ~]# sed -n '/Certificate/{p;=}' input #打印与Certificate匹配行的内容及行号 [root@localhost ~]# sed '/Certificate/{s/i/I/g;s/le/99/;}' input #在与certificate关键字匹配行将全部的i替换为I、将第1个le替换为99 |
n | 读取下一个输入行,用下一个命令处理新的行 | [root@localhost ~]# sed '/Certificate/{n;s/le/99/;}' input |
h | 将模式缓冲区的文本复制到保持缓冲区 | [root@localhost ~]# sed '/Subject/h' input |
H | 将模式缓冲区的文本追加到保持缓冲区 | [root@localhost ~]# sed '/seugrid/H' input |
x | 互换模式缓冲区和保持缓冲区的内容 | [root@localhost ~]# sed '/seugrid/x' input |
g | 将保持缓冲区的内容复制到模式缓冲区 | |
G | 将保持缓冲区的内容追加到模式缓冲区 | [root@localhost ~]# sed '$G' input |