• Linux上文本处理三剑客之sed


    文本处理工具sed

    定义:

    sed Stream EDitor ,又称行编辑器

    sed是一种流编辑器,它一次只处理一行内容,处理时,把当前处理的行存储在临时缓冲区中,称为"模式空间"(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容输送到屏幕上,接着处理下一行,这样不断重复,知道文件末尾。文件内容并没有发生改变,除非你使用重定向存储输出。sed主要用来自动标记一个或多个文件,简化对文件的反复操作,编写转换程序等

    用法:

    Usage: sed [OPTION]... {script} [input-file]...


    常用选项:

        -n :不输出模式空间内容的自动打印

        -e :多点编辑 比如: sed -e 's@^#[[:space:]]*@@' -e '/^UUID/d' /etc/fstab

        -f /PATH/TO/SCRIPT_FILE :从指定文件中读取编辑脚本

        -r :支持使用扩展正则表达式

        -i :原处编辑(警告:直接修改原文件)


    地址定界:

    1,空地址:对全文进行处理

    2,单地址:

             # :指定行

            /pattern/ :被此模式所匹配到的每一行

    3,地址范围

            #,#

            #,+#

            #,/part1/

            /part1/,/part2/

            $:最后一行

    4,步行:~

            1~2:所有奇数行

            2~2:所有偶数行

     


    编辑命令:

        

    •   d :删除模式空间匹配的行

    •   p :显示模式空间中的内容

    •   a \text :在行后面追加文本text,支持使用\n实现多上追加

    •   i \text :在行前面插入文本text,支持使用\n实现多上插入 

    •   c \text :把匹配到的行替换此处指定的文本text.可以有多行

    •   w /PATH/TO/SOMEFILE :保存模式空间匹配到的行至指定的文本中

    •   r /PATH/FROM/SOMEFILE :读取指定文件的内容至当前文件被模式匹配到的行后面,文件合并

    •   = :为模式匹配到的行打印行号

    •   ! :模式空间中匹配行取反处理

    •   s/// :查找替换,其分隔符可自行指定,常用的有s@@@,s###等

    替换标记:

     g :行内全局替换

     w /PATH/TO/SOMEFILE :将替换成功的结果保存至指定文件中

     p :显示替换成功的行


    比如:

     

    •   sed -n '/^$/=' file          显示空行行号 

    •   sed -n -e '/^$/p' –e '/^$/='  file         打印空白行并显示行号

                由于看不出效果,我加了一个参数 !,打印非空白行

    •   sed '/root/a\superma' /etc/passwd         在匹配到root行后插入

    •   sed '/^$/d' file          删除空白行

    •   sed '1,10d' file          删除1-10行 

    •   sed 's@var@rooterr@g' /etc/passwd         替换每行所有匹配到的字符

    •   sed -n 's@root@super&er@pg' /etc/passwd         全行替换root为rootroot---  &引用所匹配到的元素

        

    •   sed –i.bak 's/dog/cat/g' file      先创建备份,在执行操作


    实战练习:

    1、删除/etc/grub2.conf文件中所有以空白开头的行行首的 空白字符 

    sed 's@^[[:space:]]\+@@' /etc/grub2.cfg

     

    2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空 白字符的行的行首的#和空白字符 

    sed 's@^#[[:space:]]\+@@' /etc/fstab

     

    3、在/root/install.log每一行行首增加#号 

    sed 's@^@#@' /etc/passwd

     

    4、在/etc/fstab文件中不以#开头的行的行首增加#号 

    1. sed  -r 's@(^[^#])@#\1@' /etc/fstab  
    2. sed 's@^[^#]@#&@' /etc/fstab

     

    5、处理/etc/fstab路径,使用sed命令取出其目录名和基名 

    echo /etc/fstab/sadfsad/sdfsadf/aa  | sed -r 's@(.*/)([^/]+)\/?$@\1 \2@'

    6、利用sed 取出ifconfig命令中本机的IPv4地址

    1. ifconfig | sed -n  '2p' | sed -r 's@^[[:space:]]+inet[[:space:]]@@'|sed -r 's@[[:space:]].*@@' 
    2. ifconfig| sed   -r -n  's@^[[:space:]]+inet[[:space:]](.*)net.*@\1@p'

     

    7、统计centos安装光盘中Package目录下的所有rpm文件的 以.分隔倒数第二个字段的重复次数

    ls *.rpm | sed -r  's@.*\.(.*)\.rpm@\1@' | sort | uniq -c


    高级编辑命令

     

    • h :把模式空间中的内容覆盖至保持空间中

    • H :把模式空间中的内容追加至保持空间中

    • g :从保持空间中取出数据覆盖至模式空间中

    • G :从保持空间中取出数据追加至模式空间中

    • x :把模式空间中的内容与保持空间中的内容进行互换

    • n :读取匹配到的行的下一行覆盖至模式空间中

    • N :追加匹配到的行的下一行至模式空间中

    • d :删除模式空间中的行

    • D :删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed命令


    sed示例:

        

    • sed -n 'n;p' file  输出偶数行,相当于 sed -n '2~2p' file

    • sed '1!G;h;$!d' file  逆序输出 相当于tac命令

    • sed '$!N;$!D' file  只剩下后两行

    • sed '$!d' file  只剩下最后一行

    • sed 'G' file   每行后面追加一个空白行

    • sed '/^$/d;G' file  删除所有空白行,然后在每行后加一个空白行

    • sed -n '1!G;h;$p'  又是逆序输出

  • 相关阅读:
    ZBrush制作超酷的机器人教程
    snprintf(name,sizeof name,“%s-%d“,“thread“,i);的作用
    工作中,我们经常用到哪些SQL语句呢?
    基于SpringBoot+Vue的餐饮管理系统设计与实现
    C#使用SendMessage进行进程间通讯
    前端mockjs使用方式[express-mockjs]
    SpringBoot 过滤器和拦截器的区别
    CCF-CSP 30次 第二题【矩阵运算】
    这份文档太关键了,阿里开发6年JavaP7工程师深知MySQL重要性(建议看看)
    路由懒加载
  • 原文地址:https://blog.csdn.net/ly1358152944/article/details/126280441