sed
sed是一种新型的,非交互式的编辑器,他能执行与编辑器vi和ex相同的编辑任务。sed编辑器没有提供交互式使用方式,使用者只能在命令行输入编辑命令、指定文件名,然后在屏幕上查看输出。可以使用shell重定向来保存输出结果,默认情况下,所有输出行都被打印到屏幕上。
sed编辑器逐行处理文件(或输入),并将输出结果发送到屏幕。sed的命令就是在vi和ed/ex编辑器中见到的那些。sed把当前正在处理的行保存在一个临时缓存区中,这个缓存区称为模式空间或临时缓冲,sed处理完模式空间中的行后(即在改行上执行sed命令后),就把改行发送到屏幕上(除非之前有命令删除这一行或取消打印操作)。sed每行处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓存区中,对这个副本进行编辑,所以不会修改或破坏源文件。
文本文件(this is a line)----------------->缓存模式(this is a line)------------------------->sed的输出(屏幕输出)(this is a line)
1.命令格式
sed [ option ] 'command' 输入文本
说明:
sed命令在没有给定的位置时,默认会处理所有行。
sed支持以下几种地址类型:
1.first~setep
first指起始匹配行,step指步长,例如sed -n 2~5p,从第二行匹配,隔5行匹配一次,即2,7,12,17...
2.$
$表示匹配最后一行。
3./REGEXP/
表示匹配正则那一行,通过//之间的正则来匹配。
4.cREGEXPc
表示匹配正则那一行,通过c和c之间的正则来匹配,c可以是任意一字符。
5.addr1,add2
地址addr1,add2决定用于对哪些行进行编辑,地址的形式可以是数字、正则表达式或二者的结合,如果没有指定地址,sed将处理输入文件中的所有行。
6.addr,+N
从addr这行到往下N行匹配,总共匹配N+1行
sed的正则表达式:
sed的正则表达式元字符:
元字符 功能 示例 示例的匹配对象。
^ 行首定位符 /^love/ 匹配所有以love开头的行。
$ 行尾定位符 /love$/ 匹配所有以love结尾的行。
. 匹配除换行外的串个字符 /l..e/ 匹配包含字符l、后跟两个任意字符、再跟字母e的行。
* 匹配零个或多个前导字符 /*love/ 匹配在零个或多个空格紧跟着模式love的行。
[] 匹配指定字符组内任意一字符 /[L]ove/ 匹配包含love和Love的行。
[^] 匹配不指定字符组内任意一字符 /[^A-KM-Z]ove/ 匹配包含ove,但ove之前的那个字符不在A至K或M至Z间的行。
& 保存查找串以便在替换串中引用 s/love/**&**/ 符号&代表查找串。字符串love将替换前后各加了两个**的引用,即love变成**love**。
x{m} 连续m个x /o{5}/ 匹配连续5个字母o。
2.命令参数:
-n 使用安静模式,在一般情况所有的STDIN都会输出到屏幕上,加上-n后只打印被sed特殊处理的行
-e 多重编辑,且命令顺序会影响结果。
-f 指定一个sed脚本文件到命令行执行
-r sed使用扩展正则
-i 直接修改文档读取的内容,不在屏幕上输出
3.sed操作命令:
sed操作命令告诉sed如何处理由地址指定的各输入行,如果没有指定地址,sed就会处理输入的所有的行。
命令 说明
a 在当前行后添加一行或多行
c 用新文本修改(替换)当前行中的文本
d 删除行
i 在当前行之前插入文本
h 把模式空间里的内容复制到暂存缓存区
H 把模式空间里的内容追加到暂存缓存区
g 取出暂存缓存区里的内容,将其复制到模式空间,覆盖该处原有内容
G 取出暂存缓存区里的内容,将其复制到模式空间,追加在该处原有内容
I 列出非打印字符
p 打印行
n 读入下一输入行,并从下一条命令而不是第一条命令开始处理
q 结束或退出sed
r 从文件读取输入行
! 对所选行以外的所有行应用命令
s 用一个字符串替换另一个
替换标志:
g 在行内进行全局替换
p 打印行
w 将行写入文件
x 交换暂存缓冲区与模式空间的内容
y 将字符转换为另一字符(不能对正则表达式使用y命令)
4.实例操作
实例1:sed '/root/p' /etc/passwd
sed -n '/root/p' /etc/passwd
说明:
默认情况下,sed把所有输入行都打印在变准输出上,如果在某一行匹配到root,sed就把该行另外打印一遍。当选项-n和命令p同时出现时,sed只打印选定内容的行。
实例2:
sed ‘3d’ /root/passwd
sed '3,$d' /root/passwd
sed '/root/d' /root/passwd
说明:
第2行被删除,第3行到最后一行被删除,包含root的行被删除,其余行被打印。
实例3:
sed ‘s/root/test/g’ /root/passwd #全局替换将root替换成test,替换后的行和其他行均被打印
sed -n 's/root/test/p' /root/passwd #只打印替换后的行,只替换每行中首个root
sed 's/[0-9][0-9]$/&.5/' /root/passwd #将末尾两位数的行加上.5
sed -n 's/root/test/gp' /root/passwd #只打印替换后的行
sed 's/(root)/1test/p' /root/passwd #在圆括号里的模式root作为标签1保存在特定的寄存器中,替换的串可以通过1来引用它,则root将替换为roottest
sed 's#root#test#g' /root/passwd #使用#符号代替/符号作为分隔符
实例4:
sed -n '/root/,/dbus/' /etc/passwd #打印root和dbus之间的所有行,如果root在dbus之后的行出现则打印从root到下一个dbus之间的行
sed -n ’5,/dbus/‘ /etc/passwd #打印第五行到dbus之间的所有行
sed '/root/,/dbus/s/$/**cool**/' /etc/passwd #将root到dbus之间的行尾加上**cool**
实例5:
sed -e ’1,3d‘ -e's/root/test/' /root/passwd #多重编辑功能
实例6:
sed ’/^root /a Hello root‘ /root/passwd #以root开头的行,root行后需要加空格
sed '/^root /i Hello root ---------------------' /root/passwd #以root开头的行,root行前行加入一行Hello root 一行----------------------
sed ’/^root /c Hello root ---------------------‘ /root/passwd #修改缓存区中以root开头的行
sed '/Hello / {n;s/world/Rootor/;}‘ /root/passwd #将以命令未执行成功
sed '/Hello /y/0/1/' passwd #将带有Hello行中的0换成1
5.生产环境案例:
sed 's/^ *//g' /root/passwd #文件以空格开头的行,将空格去掉
sed 's/^[0-9][0-9]//g' /root/passwd #删除行首数字