1. 概念
Sed命令是Linux下文件编辑利器,是一个正则模式匹配编辑器,sed的基本用法是:
Sed [option] {script} [input_file]
Option有以下几个选项:
-n,–quient, –silent 不打印
-e script 追加命令行,与script内加分号类似
-f script-file 按照文件中的命令执行
-l N,–line-length=N 指定换行长度
–posix 禁用所有GNU扩展
-r 使用扩展正则表达式
-s 把文件当做分隔的,而不是一个连续的长流
-u 从输入文件中加载最小量的数据,并且经常清空输出缓冲区
Script 主要是按照以下语法:
[address1,[address2]]{!}[cmd]
Address可以是行号,也可以是模式,比如:
“2,/py/s/boy/man/g” 表示从第2行开始到匹配py的行,把每行的boy替换成man。
Address2还可以是相对值,比如:
“/py/,+3s/boy/man/g” 表示从匹配到py的行开始,到后面的连续3行。。。
如果address1和address2都是模式,则表示从匹配address1开始,一直到匹配address2结束。
伪代码如下:
bexec = false
for line in file:
pattern_space = line
#从匹配address1开始
if (match(address1)) :
bexec =true
if (bexec) :
pattern_space = Exec(cmd,pattern_space);
if (option hasn’t -n):
Print pattern_space
#到匹配address2结束
if(match(address2)) :
bexec = false
cmd有以下几个命令:
s:替换字符串,(正则模式匹配后再替换)
c:替换整行
d:删除整行
p:打印 (等于grep了)
a:后面添加一行
i:前面添加一行
2. 原理
Sed维护了2个数据缓冲区:Pattern space、Hold space,初始都为空。
Sed循环处理每一行数据。读取一行后,先移除末尾的换行符,放入pattern space。然后开始执行命令,每个命令都必须有一个关联地址,用来限定命令执行的范围,如果不指定就是这一整行。在命令执行之前,要先验证这个地址,才开始执行命令。
当到达脚本末尾,pattern space的内容会被打印出来,并加上之前移除的末尾换行符。如果使用了-n选项,则不打印。
除非使用了特殊命令(比如D),pattern space 在2个周期之间被删除。但hold space在周期之间会保留它的数据。
3. 实践
去掉linux的root密码:
sed “/root/ c root::14250:0:::::” /etc/shadow
其他,参看sed在线帮助上的例子,只能说让人叹为观止,sed可以干这么多事。比如:文本居中、算术运算、添加行号、计算单词个数等等。
具体参考:http://www.gnu.org/software/sed/manual/sed.html#Examples。
4. 参考文献
[1]. 在线sed帮助手册 http://www.gnu.org/software/sed/manual/sed.html
[2]. 耗子叔的sed 简明教程 http://coolshell.cn/articles/9104.html/