SED命令

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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值