首页 > 其他 > 详细

sed命令

时间:2016-01-08 20:40:33      阅读:106      评论:0      收藏:0      [点我收藏+]

sed:Steam EDitor

    流编辑器(行编辑器)(全屏编辑器:nano、vi)

    模式空间:sed运行过程中维护着两个缓冲区,一个是活动的“模式空间(pattern space)”,另一个是起辅助作用的“暂存缓冲区(holding space)”。一般情况下,每当运行sed,sed首先把第一行装入模式空间,进行处理后输出到屏幕,然后将第二行装入模式空间替换掉模式空间里原来的内容,然后进行处理,以此类推。

    sed默认不修改原文件,仅对模式空间的内容进行编辑,最后显示模式空间的内容

    格式:

        sed [option] ‘Addresscommand‘ file ...


address:

    startline,Endline

        比如1,100 表示第1到100行

        $:最后一行

    /pattern/

        模式匹配到的行,比如/root/,表示包含root的行

    /pattern1/,/pattern2/

        表示从第一次别模式1匹配到的行开始,到第一次被模式2匹配到的行结束,这中间所有的行

    lineNumber

        行号所指定的行

    startline,+N

        从指定的行号开始,向后的N行

    Address不写的话,默认是全文


Command:

    大P:打印模式空间

    p:显示符合条件的行

    d:删除符合条件的行

    a \string:在指定的行后面追加新行,内容为string

        \n:可以用于换行

    i \string:在指定的行前面追加新行,内容为string    

    r FILE:将指定的文件内容追加至符合条件的行后面

    w FILE:将指定范围内的内容另存至指定的文件中

    s/pattern/string/修饰符:查找并替换,默认只替换每行中第一次被查找到的字符串

        修饰符:

            g:全局替换

            i:忽略字符大小写

        s///格式也可以用s@@@、s###等

            \(\),\1,\2支持正则表达式里面的分组功能

            &:引用模式匹配整个串


option:

    -n:静默模式,不再默认显示模式空间的内容

    -i:直接修改原文件

    -e script -e script:可以同时制定多个脚本

    -f /path/to/file :从文件中读取脚本

    -r :表示使用扩展的正则表达式


s///分组使用示例:

[root@logstach ~]# cat 1.txt 

hello  ,my  love

listen  like

假设我们要一次性把1.txt里面l..e能匹配到的字符后面加个r,比如like变成liker,这个时候,用类似s/l..e/string/ 是无法达到我们想要的结果的,但是分组功能或者使用&可以实现:

[root@logstach ~]# sed ‘s/\(l..e\)/\1r/‘  1.txt 

hello  ,my  lover

listen  liker

[root@logstach ~]# sed ‘s/l..e/&r/‘  1.txt 

hello  ,my  lover

listen  liker


sed练习:

1、删除/etc/grub.conf文件中行首的空白符;

    sed ‘s/^[[:space:]]*//‘ /etc/grub.conf 

2、替换/etc/inittab文件中“id:3:initdefault:”一行中的3为5;

    sed ‘s/id:3:initdefault:/id:5:initdefault:/‘ /etc/inittab         

3、删除/etc/inittab文件中的空白行;

    sed ‘/^$/d‘ /etc/inittab

4、删除/etc/inittab文件中开头的#号;

    sed ‘s/^#//‘ /etc/inittab

5、取出一个文件路径的目录名称;

    echo "/etc/inittab/" |sed -r ‘s/^(\/.*\/)[^/]+\/?/\1/g‘

       \/.*.\/是利用正则的贪婪性取出第一个/到可以匹配的最后一个斜杠内容,就是文件的路径了
        \1匹配第一()里面的内容,这里的作用是用第一()的内容替换整个字符串,最后显示
        第一个^是行开头的意思
        第二个^取非的意思,[^/]+就是不是/的字符一个或者多个,\/?是0或者1个/
        由于不在()里面,所以不打印
        取路径有很多种方法
        ${file%/*}
        dirname
        都可以




本文出自 “单季稻” 博客,请务必保留此出处http://linzb.blog.51cto.com/5192423/1732936

sed命令

原文:http://linzb.blog.51cto.com/5192423/1732936

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!