在编写shell脚本的过程中,我们经常需要使用sed流编辑器和awk对文本文件进行处理。
什么是sed?
sed是一种在线编辑器,它一次处理一行内容。sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结构。默认情况下,所有的输出行都被打印到屏幕上。
sed的处理过程是什么?
sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed先把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入。进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。
sed命令语法
sed [option] ‘AddressCommand‘ file....
常用的option选项参数如:
-i:修改源文件
-n:静默模式
Address
基本可以将其理解为对行的匹配,比如我有个100行的文件,现在有只想对它的第二行到第五行进行删除,这个就是Address
1、StartLine,EndLine 比如1,100
m,n:表示删除第m行到底n行,例如‘2,5d‘,表示删除第2行到第5行
m,$:表示删除第m行到最后一行,$-1位倒数第2行
2、使用模式/Pattern/ 使用正则表达式
一旦可以使用正则表达式之后,就会很灵活了
sed ‘/root/d‘ /etc/passwd #找到root匹配的行,然后进行删除
3、/pattern1/,/pattern2/ 表示第一次被pattern1匹配到的行开始,至第一次被pattern2匹配到的行结束
这个和之前的范围有点类似,但是他又是正则表达式的匹配
sed ‘/root/,/^mysql/d‘ /etc/passwd ##这个有问题
4、LineNumber 表示指定的行
例如‘3d‘,表示删除第3行
5、StartLine,+N 表示从startline开始,向后N行,总数N+1行
sed ‘1,+1/d‘ /etc/passwd
Command
d:表示删除符合要求的行
p:显示符合条件的行
a \string :表示在指定的行后面追加新行,内容为string
i \string:表示在指定的行前面追加新行,内容为string
r filename:将指定的文件的内容添加至符合条件的行处
w filename:将指定范围内的内容另存至指定的文件中
s /pattern/string/:查找并替换默认只替换每行中第一次被模式匹配到的字符串,修饰符g表示全局替换
s #pattern#string#:查找并替换默认只替换每行中第一次被模式匹配到的字符串,修饰符g表示全局替换
s @pattern@string@:查找并替换默认只替换每行中第一次被模式匹配到的字符串,修饰符g表示全局替换
&:引用匹配模式的整个串 例如sed ‘s/s..p/&r/‘ /etc/fstab 整个s..p的文件后面换成s..pr
\(\):后项引用sed ‘s/\(s..p\)/\1r/‘ /etc/fstab 表示s..p表示在第1项后面加1 看操作理解sed ‘s#s\(..p\)#S\1#‘ /etc/fstab
练习:
1、删除/etc/grub.conf文件中的行首的空白符
sed ‘#\<^$\>#d‘ /etc/grub.conf
2、删除/etc/inittab文件中"id:5:initdefault:" 一行中的数字为3
sed ‘s#id\:5\:initdefault\:#id\:3\:initdefault\:#‘ /etc/inittab
3、删除/etc/inittab文件中的空白行
sed ‘/^#/d‘ /etc/inittab
4、删除/etc/inittab文件中开头的#号
sed ‘s/^#//‘ /etc/inittab
5、删除/etc/inittab文件中开头的#号及后面的空白字符,要求#号后面必须有空白字符
sed ‘s/^#/ /‘ /etc/inittab
本文出自 “常想一二” 博客,请务必保留此出处http://250919938.blog.51cto.com/962010/1918599
原文地址:http://250919938.blog.51cto.com/962010/1918599