以前一直觉得sed很神秘,很复杂,像找个空闲的时间的好好学一下。昨晚刚好像找点事做做,于是就看了下sed的info文档。才发现原来sed并不是那么难学的,如果熟悉regexp的话,那学起来就很简单了。
flags:g|number|p|w file|e|I|M
e flag很好玩,它将pattern space的内容当作一个shell命令执行,并将执行结果替换pattern space的内容。
注意souce_chars和object_chars的字符个数必须相等。例如:y/a-z/A-Z/ 将小写字母替换成大写字母。
将pattern space的末尾添加一个换行符,并读入下一行。行号加一。
打印pattern space的第一行
sed在处理文本的过程中,有两个空间active pattern space 和 auxiliary hold space。 一般情况下sed从输入文本读入一行放在pattern space,然后对这个space的内容执行,所有指定的命令。命令执行完后,将pattern space清空,读入下一行,再对其执行命令。这样一行一行执行,直到文件的最后一行或有q命令终止。auxiliary hold space不常用到,只有少数的几个命令会有影响,此处略。
调用如下:
$sed [option] [script] [inputfile]
终端调用GNU/sed的命令行参数有几个,但其中两个用的比较多:
-
-i[suffix] 将命令的处理结果直接覆盖原文件,如果后面有参数,则将原文件名末尾加上suffix作为原文件的备份文件名,然后再结果覆盖原文件。 -
-n 不加改option时,sed默认每个cycle(即sed的所有命令)执行完后,输出pattern space的内容。使用-n时则不默认输出。
地址参数
sed的命令一般可有一到两个地址参数,来控制命令的执行范围。地址参数形式:
number
例如:3p 打印第三行
first~step
例如:3~2p 从第三行开始,打印3、5、7、9...行
$
文本末行,例如:$p 打印文本末行
/regexp/或\%regexp%
如正则表达式匹配的行
/regexp/I或/%regexp%I
正则表达式匹配时,忽略大小写
/regexp/M 或 /%regexp%M
当pattern space只有一行时,M没有任何作用。当有多行时,M使得$可以同时匹配行尾和pattern space的结尾,^可以同时匹配行首和pattern space的头部。不加M时$不能匹配行尾。^不能匹配行首。
可执行的命令:
#
注释符
q [exit code]
退出sed程序
d
清空 pattern space的内容,终止当前cycle。读入下一行执行
p
打印pattern space的内容
n
删除pattern space内容,读入下一行,继续执行。
s/regexp/replacement/flags
y/source_chars/object_chars/
a text
c text
i text
l n
r file
w file
D
这个命令开始有点难以理解,它的作用是:
1、当pattern space只有一行时,删除该行,终止这个cycle。读入新的一行,重新执行。
2、当pattern space有多行时,删除第一行,不读入新的一行,重新执行这个cycle。直到pattern space的内容为空时,读入下一行执行。
N
P
h
H
g
G
x