zoukankan      html  css  js  c++  java
  • 文本三剑客---sed 基础

    sed编辑器被称作流编辑器(stream editor),和普通的交互式文本编辑器恰好相反。在交互式文本编辑器中(比如vim),你可以用键盘命令来交互式的插入、删除或者替换数据中的文本。流编辑器则会自爱编辑器处理数据之前基于预习提供的一组规则来编辑数据流。

    sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行输入,要么存储在一个命令文件中。sed会执行下列操作:

    (1)一次从输入中读取一行数据。
    
    (2)根据所提供的编辑器命令匹配数据
    
    (3)安装命令修改流中的数据
    
    (4)将新的数据输出到STDOUT
    

    在流编辑器将所有命令与一行数据匹配完毕后,它会读取下一行数据并重复这个过程。在流编辑器处理完流中的所有数据行后,它就会终止。

    由于命令是按顺序逐行执行的,sed编辑器只需对数据流进行以便处理就可以完成编辑操作。这使得sed编辑器要比交互式编辑器快得多,可以快速完成对数据的自动修改。

    用法

    sed [option]… 'script' intputfile
    

    1 常用选项

    -n:不输出模式空间内容到屏幕,既不自动打印
    -e:多点编辑
    -f:/PATH/SCRIPT_FILE:从指定文件中读取编辑脚本
    -r:支持使用扩展正则表达式
    -i.bak:备份文件并原处编辑
    

    script:
    "地址命令"

    2 地址定界

    (1)不给地址:对全文进行处理

    (2)单地址:

    #:指定的行
    
    /pattern/:被此处模式所能够匹配到的每一行
    

    (3)地址范围:

    #,#
    #,+#
    /pat1/,/pat2/
    #,/pat1/
    

    (4)~:步进
    1~2 奇数行
    2~2 偶数行

    3 基本编辑命令

    d:删除模式空间匹配的行
    p:显示模式空间中的内容
    a[]text:在指定行后面追加文本,支持使用
    实现多行追加
    i[]text:在行前面插入文本
    c[]text:替换行为单行或多行文本
    w /path/somefile:保存模式匹配的行至指定文件
    r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
    = :为模式空间中的行打印行号
    ! :模式空间中匹配行取反处理
    s/oldstr/newstr/:查找替换,支持使用其它分隔符,s@@@,s###
    替换标记:
        g:行内全局替换
        p:显示替换成功的行
        w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
    

    4 常用命令

    (1)打印第N行

    [root@local ~]# sed -n '2p' /etc/passwd
    
    bin:x:1:1:bin:/bin:/sbin/nologin
    

    (2)打印第N至M行

    [root@local ~]# sed -n '1,4p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    

    (3)打印所有包含关键字string的行

    [root@local ~]# sed -n '/root/p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/root:/sbin/nologin
    

    (4)打印从第N行开始到有关键字string 的行

    [root@local ~]# sed -n '1,/root/p' /etc/passwd
    
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
    sync:x:5:0:sync:/sbin:/bin/sync
    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
    operator:x:11:0:operator:/root:/sbin/nologin
    

    (5)显示空行行号

    [root@local ~]# sed -n '/^$/=' /etc/fstab
    
    1
    

    (6)在关键字行后追加文字

    [root@local ~]# sed '/root/asuperman' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    superman
    bin:x:1:1:bin:/bin:/sbin/nologin
    [……]
    operator:x:11:0:operator:/root:/sbin/nologin
    superman
    games:x:12:100:games:/usr/games:/sbin/nologin
    [……]
    

    (7)在关键字string行前追击文字

    [root@local ~]# sed '/root/isuperman' /etc/passwd
    superman
    root:x:0:0:root:/root:/bin/bash
    [……]
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    superman
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    [……]
    

    (8)替换行为单行或多行文本

    [root@local ~]# sed '/root/csuperman' /etc/passwd
    superman
    bin:x:1:1:bin:/bin:/sbin/nologin
    [……]
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
    superman
    games:x:12:100:games:/usr/games:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    [……]
    

    (9)删除指定行

    [root@local ~]# sed '1,10d' /etc/passwd
    或[root@local ~]# cat -n /etc/passwd |sed '1,10d'
    11    games:x:12:100:games:/usr/games:/sbin/nologin
    12    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    13    nobody:x:99:99:Nobody:/:/sbin/nologin
    14    avahi-autoipd:x:170:170:Avahi IPv4LL Stack:/var/lib/avahi-autoipd:/sbin/nologin
    

    (10)在指定行后追加文字

    [root@local ~]# nl /etc/passwd |sed '2a tea'
    1    root:x:0:0:root:/root:/bin/bash
    2    bin:x:1:1:bin:/bin:/sbin/nologin
    tea
    3    daemon:x:2:2:daemon:/sbin:/sbin/nologin
    

    (11)在关键字追加文本

    [root@local ~]# sed -n 's/root/&superman/p' /etc/passwd
    rootsuperman:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/rootsuperman:/sbin/nologin
    

    (12)在关键字前追击文本

    [root@local ~]# sed -n 's/root/superman&/p' /etc/passwd
    supermanroot:x:0:0:root:/root:/bin/bash
    operator:x:11:0:operator:/supermanroot:/sbin/nologin
    

    (13)全局查找替换

    [root@local ~]# sed 's/UUID/hahaha/g' /etc/fstab
    [……]
    hahaha=227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
    hahaha=7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
    hahaha=12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
    

    (14)使用多个编辑器命令

    [root@local ~]# sed -e 's/UUID/hahaha/g' -e 's/=/###/g' /etc/fstab
    [……]
    hahaha###227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
    hahaha###7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
    hahaha###12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
    

    (15)修改前备份

    先把/etc/fstab复制到当前目录下,以防止直接修改
    
    [root@local ~]# cp /etc/fstab .
    [root@local ~]# sed -i.bak 's/=/$$$$$/g' fstab
    [root@local ~]# cat fstab fstab.bak
    [……]
    UUID$$$$$227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
    UUID$$$$$7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
    UUID$$$$$12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
    [……]
    UUID=227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
    UUID=7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
    UUID=12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
    [root@local ~]#
    

    (16)从文件中读取编辑命令

    [root@local ~]# cat script1.sed
    s/=/$$$$/
    s/UUID/mytest/
    
    [root@local ~]# sed -f script1.sed fstab
    [……]
    mytest$$$$227a3d28-7318-4a4d-8b1e-e076460506b8 / xfs defaults 0 0
    mytest$$$$7ea2bade-f418-4d0a-93cd-b413406e604e /boot xfs defaults 0 0
    mytest$$$$12e75d1f-a8e4-4663-afb7-a018beae1e52 swap swap defaults 0 0
    
  • 相关阅读:
    java操作redis之jedis篇
    实现指定步长循环后移字符串数组算法
    【PAT Advanced Level】1006. Sign In and Sign Out (25)
    银行计算利息
    中国人、美国人、北京人
    网络子系统55_ip协议分片重组_加入ipq
    C#拦截系统消息的方法-Application.AddMessageFilter
    C#实现在Form上截取消息的两种方法
    Geek改变世界
    中国黑客传说:游走在黑暗中的精灵
  • 原文地址:https://www.cnblogs.com/Sunzz/p/7231009.html
Copyright © 2011-2022 走看看