zoukankan      html  css  js  c++  java
  • 文本处理三剑客之sed(流编辑器)

    文本处理三剑客之sed(流编辑器)

    - 行编辑器

    把当前处理的行存储在临时缓冲区,称为模式空间,然后把模式空间的内容送往屏幕,一行一行的处理,主要用来编辑一个或者多个文件。

    - 用法
    • sed [option]... 'script' inputfile...
    ###### - 常用选项
    • -n:不输出模式空间内容到屏幕,即不自动打印 默认会打印模式空间的内容
      加-n 可以只显示需要打印的行
    [root@localhost home]# sed  -n '2,3p'  /etc/passwd
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    • -e:多点编辑
    [root@localhost home]# sed -n -e '/^$/=' -e '/^U/=' /etc/fstab
    1
    9
    10
    11
    12
    13
    14
    15
    显示/etc/fstab中的空行和U开头的行的行号
    • -r: 支持使用扩展正则表达式
    [root@localhost home]# echo /etc/sysconfig/network-scripts/ | sed -r 's@(^/.*/)([^/]+/?)@\2@'
    network-scripts/
    
    取地址的基名,用正则表达式,  字符替换的方式,分两组用“()”, 第二组“^/”代表不止一个字符 “/?”代表前面的“/”可有可无,\2取第二组
    • -i .bak: 备份文件并原处编辑
    [root@111 home]# echo '1111111' >f1
    [root@111 home]# echo '2222222' >>f1
    [root@111 home]# echo '3333333' >>f1
    [root@111 home]# cat f1
    1111111
    2222222
    3333333
    [root@111 home]# sed -i.bak "2d"  f1
    [root@111 home]# cat f1
    1111111
    3333333
    [root@111 home]# cat f1.bak 
    1111111
    2222222
    3333333
    
        - 加.bak是备份文件的,如果不加.bak很危险,以免失误先保存。
    • -f :/ PATH/SCRIPT_FILE : 从指定文件中读取编辑脚本
    sed  -f /PATH/SCRIPT_FILE
    执行脚本 给sed更多功能
    - 地址定界
    • script: ' 地址命令'
    • 不给地址:对全文进行处理 默认情况下显示全文
    • 单地址: #: 指定的行 “#”代表任意一行行数
    • /pattern/ :被此处模式所能够匹配到的每一行
    '/^$/' 匹配空行
    • #,# 第几行到第几行
    /pat1/,/pat2/
    匹配到的第一个字符的第一行
    到匹配到的第二个字符的最后一行
    • #,/pat1/
    - sed –n ‘1,4p’ /etc/passwd
       - 显示1到4行的内容
    • ~ :步进
    - 1~2  只显示文件内的奇数行
       - 说明(1)~( 1,2)下一位数就是(3)
    举例:seq 10 | sed -n ‘1~2p’
    - 2~2 同理显示文件内的偶数行,
           - 当然奇数行偶数行显示不止这一种方式以下奇数行举例
           - seq 10|sed -n '1~2p'
           - seq 10|sed '2~2d'
           - seq 10|sed -n '2~2!p'
           - seq 10|sed 'n;d'
    - 编辑命令
    选项介绍
    d 删除模式空间匹配的行
    p 显示模式空间中的内容
    a []text 在指定行 后面 追加文本支持使用\n实现多行追加
    i []text 在行前面插入文本
    c []text 替换行为单行或多行文本
    w /path/somefile 保存模式匹配的行至指定文件
    r /path/somefile 读取指定文件的文本至 模式空间中匹配的行后
    = 为模式空间中的行打印行号
    模式空间中匹配行取反处理
    s/// 查找替换, 支持使用其它分隔符,s@@@ ,s###
    g 整行替换 如果不加g 只替换每行第一个匹配到的字符
    w /PATH/TO/SOMEFILE 将替换成功的 行 保存至文件中

    很危险的命令 替换之前先保存

    3~6行打印行号
    [root@111 home]# cat /etc/passwd | sed '3,6='
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    3
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    4
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    5
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    6
    sync:x:5:0:sync:/sbin:/bin/sync
    
    把root替换成ROOT并保存到 p1文件中
    [root@111 home]# sed -n 's/root/ROOT/w p1' /etc/passwd 
    [root@111 home]# cat p1
    ROOT:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/ROOT:/sbin/nologin
    
    给/etc/passwd文件中的第3~6行后面加上/etc/issue文件中的内容
    [root@111 home]# cat /etc/passwd | sed '3,6r /etc/issue'
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    CentOS release 6.8 (Final)
    Kernel \r on an \m
    
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    CentOS release 6.8 (Final)
    Kernel \r on an \m
    
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    CentOS release 6.8 (Final)
    Kernel \r on an \m
    
    sync:x:5:0:sync:/sbin:/bin/sync
    CentOS release 6.8 (Final)
    Kernel \r on an \m
    
    shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
    halt:x:7:0:halt:/sbin:/sbin/halt
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    
    这个例子不太明显 就是passwd中的第3~6行不显示
    [root@111 home]# sed '3,6!p' /etc/passwd 
    root:x:0:0:root:/root:/bin/bash
    root:x:0:0:root:/root:/bin/bash
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    
    注释全文
    [root@111 home]# sed -r 's/^[^#]/#&/' /etc/fstab
    
    #
    # /etc/fstab
    # Created by anaconda on Thu Mar 30 04:43:20 2017
    #
    # Accessible filesystems, by reference, are maintained under '/dev/disk'
    # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
    #
    #UUID=5bcb6b51-15c5-4820-bab4-d365adf45e81 /                       ext4    defaults        1 1
    #UUID=910d7084-86b0-4de8-b3c2-c691e309f35f /apps                   ext4    defaults        1 2
    #UUID=391dcc7d-a5f2-4495-bc11-d8577c48a29f /boot                   ext4    defaults        1 2
    #UUID=d1c98cc5-2350-462b-a42d-5a23cad37ed9 /home                   ext4    defaults        1 2
    #UUID=41ab819e-889c-4714-9fd6-1c5379f51451 /tmp                    ext4    defaults        1 2
    #UUID=ee36b6c3-6e6f-4f48-bc3c-75311760e9ee swap                    swap    defaults        0 0
    #tmpfs                   /dev/shm                tmpfs   defaults        0 0
    #devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
    #sysfs                   /sys                    sysfs   defaults        0 0
    #proc                    /proc                   proc    defaults        0 0
    高级编程命令
    • 烧脑模式 前方高能 请警惕
    • sed除了“模式空间”(pattern space),还有一个“hold space”内存空间,称之为保持空间

    sed工作机制是每次读取一行文本至“模式空间”中,在模式空间中完成处理,将处理结果输出至标准标准输出设备;在模式空间中处理一行内容后会继续处理下一行,那么对于处理过的行可能还会有其他的处理,因此可以先把处理过的行“传送”至保持空间,然后在后续的处理中再次"传送"回模式空间中,这就类似加工车间及仓库的概念,好比模式空间是交工车间,保持空间是仓库,不过这里的仓库存放的是半成品。

    选项介绍
    d 删除模式空间中的行
    D 删除 当前模式空间开端至\n 的内容( 不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed
    g 从保持空间取出数据覆盖至模式空间
    G 从保持空间取出内容追加至模式空间
    x 把模式空间中的内容与保持空间中的内容进行互换
    n 读取匹配到的行的下一行 覆盖 至模式空间
    N 读取匹配到的行的下一行 追加 至模式空间
    h 把模式空间中的内容覆盖至保持空间中
    H 把模式空间中的内容追加至保持空间中

    这里举例:sed '1!G;h;$!d' FILE1 

    这里用FILE1文件举例 比如文件内容总共三行 

    1!G:如果不是第一行从保持空间取出内容追加至模式空间

    $!d:不是最后一行删除模式空间中的行

     

    1、把FILE1文件第一行“111111”输出到模式空间 

    2、把模式空间“111111”内容存至保持空间 

      

    1、把FILE1文件第二行输出到模式空间             

    2、把保持空间的“111111”追加至模式空间        

    3、把模式空间的“222222”“111111”覆盖至保持空间   

    1、把FILE1文件第三行输出至模式空间

      2、把保持空间内容“222222”“111111”追加至模式空间

    3、默认打印模式空间的内容至屏幕

  • 相关阅读:
    ipa在线下载安装(itms-services)
    linux环境下无文件执行elf
    Linux Running State Process ".so"、"code" Injection Technology
    VS2013本地C++单元测试框架
    vs的环境变量
    利用rundll32执行程序的函数执行程序
    动态so注入
    ELF运行时注入
    MailKit系列之转发电子邮件
    WPF实战之一 桌面消息框(右下角消息弹出框)
  • 原文地址:https://www.cnblogs.com/MYue/p/6792836.html
Copyright © 2011-2022 走看看