一、sed介绍
sed 一种流式编辑器。一个流式编辑器通常对来自输入流(一个文件或者是管道的输入)的文本进行转换处理。在某些方面类似支持脚本编辑的编辑器,sed在多输入情况下只开放一个通道工作,因此更加效率。sed与其他编辑器最大的区别在于,能对管道输入的文本进行过滤处理。
二、sed工作机制
sed保持两个数据缓冲区:主要活动的模式空间,以及辅助性的保持空间。两者初始状态都为空。
sed以对输入的每一行文本执行下列循环操作的方式来运作:首先,sed从输入流读取一行数据,移走任何后面的换行符【注】,将读取的一行放入模式空间。然后执行命令;每一条命令可以关联一个地址:这些地址是一种条件码,一条命令执行之前先确认条件是否符合才会被sed执行。
当执行完脚本末行命令时,如果没有启用 -n选项,打印模式空间里的文本到输出流,在后面加上移走的换行符。然后读取下一输入行循环处理。所以sed在默认情况下不会对原文件改动。
如果没有特别指令(比如'D')说明,在下一个循环开始前删除模式空间的内容。而保持空间则可以保存循环之间的数据。
[注]:当有新内容追加到模式空间时,自动添加换行符
三、sed基本用法
用法:sed [OPTIONS…] 'scripts' FILE…
1.如何选定指定的行
sed中有一些指定行范围的方法,用行号指定和用正则表达式指定,以及两者结合起来指定。
-
空地址
匹配所有行;
-
N
匹配输入中第N行;
-
$
匹配最后一行;
-
/PATTERN/,\#PATTERN#
匹配符合正则表达式的行;
-
/PATTERN/I
正则匹配时忽略大小写
指定范围表达方式
-
N1,N2
匹配N1到N2之间的行
-
0,/PATTERN/
从第一行开始匹配,直到符合正则表达式的那行
-
/PATTERN1/,/PATTERN2/
匹配符合两正则表达式之间的行
-
FIRST~STEP
步进,匹配FISRT+n*STEP行,n为自然数。比如,1~2表示匹配奇数行
2.sed命令常用选项
选项 | 说明 |
-n | 取消模式空间内容的自动打印 |
-e | 多点编辑 |
-f | 指定脚步文件 |
-r | 支持扩展正则表达式 |
-i | 原文件编辑(慎用) |
3.sed编辑命令
1)d
删除当前模式空间内容,立即开始下一循环(不打印任何内容)
~]$ sed '1,10d' test.txt #打印除1到10行外的内容
2)p
打印模式空间的内容;常与-n选项公用
~]$ sed -n '1~2p' test.txt #打印奇数行的内容
3)a \text
行后追加text文本;另起的一行
4)i \text
行前插入text文本;另起的一行
5)c \text
指定行替换为text文本
6)w /path/file
保存模式空间中的内容到指定文件
7)r /path/file
读取文件内容到模式空间
8)=
为模式空间中的行打印行号
9)!
标记在地址后边,表示地址取反
~]$ sed -n '1!p' text.txt #除第一行外全部打印
4.替换命令
s/REGEXP/REPLACEMENT/FLAGS
表达式中'/'可用其他单个字符替换
(一)REPLACEMENT中有特殊字符,代表特殊意义
1)&
表示查找到的内容
~]$ sed 's/.*/#&/' test.txt #为每一行开头加上#
2)\L
将替换的内容都转换成小写字母,直到遇到U或者E。
3)\l
将下一个字符转换成小写字母。
4)\U
将替换的内容都转换成大写字母,直到遇到L或者E。
5)\u
将下一个字符转换成大写字母。
6)\E
停止L或者U的字母大小写转换。
(二)FLAGS
1)g
表示全行替换;默认只替换第一个匹配项
2)p
打印替换成功的行
3)w /path/file
保存替换成功的行到指定文件
例1,将/etc/fstab 文件中UUID转为小写,UUID行其他字母转为大写
$ sed -r 's/(^U.*)=(.*)/\L\1=\U\2/' /etc/fstab
例2,删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符
$ sed -r 's/^#[[:space:]]+//' /etc/fstab
原创文章,作者:cutemsyu,如若转载,请注明出处:http://www.178linux.com/33170
评论列表(1条)
文章从sed原理到常见用法,有理论有实践,排版也很精美,建议对大标题使用字体加粗会更好一点哦。