sed命令

简介:

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
        都可以


'













本文转自biao007h51CTO博客,原文链接:http://blog.51cto.com/linzb/1732936 ,如需转载请自行联系原作者



相关文章
|
7月前
vi编辑器替换字符串命令
vi编辑器替换字符串命令
76 1
|
机器学习/深度学习 存储 监控
sed命令(超详细)
是一种流编辑器,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命 令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复, 直到文件末尾。
218 0
|
Unix Shell Linux
【Shell编程】字符截取命令awk、sed命令
【Shell编程】字符截取命令awk、sed命令
238 0
|
MySQL 关系型数据库 Perl
|
Perl Shell