• sed命令


    sed命令

      sed, 即Stream Editor,是linux系统中一种行编辑器

    用法

      sed [OPTION]... {script-only-if-no-other-script} [input-file]...

    常用选项

    -n                                           不输出模式空间内容到屏幕,即不自动打印

    -e                                         多点编辑

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

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

    -i                                           直接在源文件上修改,且不备份

    -i.bak                                   对源文件进行备份,文件名FILE.bak,然后在源文件上编辑

    script

    script中的内容可以分为两大类,地址定界和命令。

    地址定界,即对需要匹配的行划定范围,可以通过指定具体的行数,比如5,或者2到9行;也可以通过正则表达式来确定。

    命令,即对通过地址匹配到的行进行的操作,包括打印、删除等。

    地址定界

    • 不给地址:对全文进行处理
    • 单地址:

    #: 指定的行

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

    • 地址范围:

    #,#

    #,+#

    /pat1/,/pat2/

    #,/pat1/

    • ~:步进

    1~2 奇数行

    2~2 偶数行

    编辑命令

    d                        删除模式空间匹配的行

    p                        显示模式空间中的内容

    a []text             在指定行后面追加文本

    支持使用 实现多行追加

    i[]text               在行前面插入文本

    c []text             替换行为单行或多行文本

    w /path/file     保存模式匹配的行至指定文件

    r /path/file        读取指定文件的文本至模式空间中

    匹配到的行后

    =                        为模式空间中的行打印行号

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

     

    搜索查找操作

    s///                     查找替换,支持使用其它分隔符,s@@@,s###

    替换标记:

    g:         行内全局替换

    p:         显示替换成功的行

    w /PATH/FILE:将替换成功的行保存至文件中

    测试1——查看(可以完成grep命令能做的大部分任务)

      创建一个文件test文件,往里写入1, 2, ...

    •  
      [root@vathe-pc tmp]#seq 1 14 > test           # 创建test文件
      [root@vathe-pc tmp]#head -6 test           # 查看前6行
      1
      2
      3
      4
      5
      6 

      单地址

    • 查看该test文件
    • [root@vathe-pc tmp]#sed '' test    #  中间单引号不能省略,表示不做处理
      1
      2
      3
      4
      5

      sed 命令默认会把每行内容都打印一篇,故而执行上面的命令,会打印全文;使用-n 选项就不会打印,可以尝试如下命令

    • [root@vathe-pc tmp]#sed -n '' test
      [root@vathe-pc tmp]#
    • 查看第3行
    • [root@vathe-pc tmp]#sed -n '3p' test    # p命令,表示打印print
      3
      [root@vathe-pc tmp]#sed '3!d' test     # d命令,表示删除delete
      3

    上面两条命令均可查看特定行,区别在于:

    第一条默认不打印,搜索到第3行,然后打印

    第二条命令,默认会打印每一行,“3!”表示不是第三行,“d”命令表示删除,则“3!d”表示不是第三行,就删除——不打印。

    • 查看出现’root’字符串的行
    • [root@vathe-pc tmp]#cp /etc/passwd ./     # 复制文件
      [root@vathe-pc tmp]#sed -n '/root/p' passwd
      root:x:0:0:root:/root:/bin/bash
    • 下面为passwd文件的前14行 
    • [root@vathe-pc tmp]#cat -n passwd         # 查看 passwd 文件
           1  root:x:0:0:root:/root:/bin/bash
           2  bin:x:1:1:bin:/bin:/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
           7  shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
           8  halt:x:7:0:halt:/sbin:/sbin/halt
           9  mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
          10  uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
          11  operator:x:11:0:operator:/root:/sbin/nologin
          12  games:x:12:100:games:/usr/games:/sbin/nologin
          13  gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
          14  ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
             ...

      范围地址查看

    • 查看5至8行
    • [root@vathe-pc tmp]#sed -n '5,8p' test
      5
      6
      7
      8
    • 打印第3行,至出现‘halt’字符的行
    • [root@vathe-pc tmp]#sed -n '3,/halt/p' passwd
      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

    测试2——修改

      行后添加。搜索含有”halt”字符的行,在每行后添加’github.com’

    [root@vathe-pc tmp]#sed  '/halt/agithub.com' 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       # 搜索到的行
    github.com                             # 添加的字符
    mail:x:8:12:mail:/var/spool/mail:/sbin/nologin

      行前添加。搜索含有”adm”字符的行,在每其每行前添加’github.com’

     

      

    [root@vathe-pc tmp]#sed  '/adm/igithub.com' 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
    github.com
    adm:x:3:4:adm:/var/adm:/sbin/nologin
    ...

      代替行内容。搜索含有‘2’字符的行,将其替换为‘100’

    [root@vathe-pc tmp]#sed '/2/c100' test
    1
    100        # 原来为2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    100        # 原来为12
    13
    14

    测试3——查询替换

    • 查询‘adm’字符串,查找到之后,将其替换为’admin’字符串
    • [root@vathe-pc tmp]#grep 'adm' passwd
      adm:x:3:4:adm:/var/adm:/sbin/nologin
      [root@vathe-pc tmp]#sed -n 's/adm/admin/p' passwd
      admin:x:3:4:adm:/var/adm:/sbin/nologin      # 仅替换第一个adm
      [root@vathe-pc tmp]#sed -n 's/adm/admin/gp' passwd
      admin:x:3:4:admin:/var/admin:/sbin/nologin  # 都替换了
      [root@vathe-pc tmp]#

      // 后一条命令g选项表示,匹配到的行,行中所有的“adm”都替换为“admin”

    • 在单词‘halt’后添加‘ing’字符串
    • [root@vathe-pc tmp]#grep halt passwd
      halt:x:7:0:halt:/sbin:/sbin/halt
      [root@vathe-pc tmp]#sed -n 's/adm/admin/gp' passwd
      admin:x:3:4:admin:/var/admin:/sbin/nologin

    高级编辑命令

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

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

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

    G:  从保持空间取出内容追加至模式空间

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

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

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

    d:    删除模式空间中的行

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

    高级用法示例

    sed 'n;d' FILE                      # 查看奇数行

    sed -n 'n;p' FILE                # 查看偶数行

    sed '1!G;h;$!d' FILE          # 逆向查看文件,类似于tac FILE

    sed '$!N;$!D' FILE             # 查看倒数两行

    sed '$!d' FILE                      # 查看最后一行

    sed ‘G’ FILE                         # 在每行后追加一空行

  • 相关阅读:
    生成随机数的范围的公式
    正则匹配<img src="xxxxxx" alt="" />标签的相关写法
    js 日常问题记录
    css 三角实例
    /users/products.:format 这种写法的其对应解析字符写法
    package.json 的语法解释
    replace 全局替换 和 数组去空
    js checkbox获取选中的值
    JavaScript基础知识一
    移动 Web 设计
  • 原文地址:https://www.cnblogs.com/vathe/p/6783188.html
Copyright © 2020-2023  润新知