• sed 笔记


    sed 笔记
    介绍
    sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
    sed编辑器逐行处理文件(或输入),并将结果发送到屏幕。具体过程如下:首先sed把当前正在处理的行保存在一个临时缓存区中(也称为模式空间),然后处理临时缓冲区中的行,完成后把该行发送到屏幕上。sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示。处理完输入文件的最后一行后,sed便结束运行。sed把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会修改原文件。

    sed '范围(模式)命令' file

    选项:
    -n:静默模式,不输出模式空间内的内容;默认打印空间模式的内容
    -r:扩展的正则表达式
    -f 文件:指定sed脚本文件
    -e 'script' -e 'script' :指定多个编辑指令
    -i : 直接编辑原文件
    编辑命令:
    d:删除
    p: 打印
    i :在被指定到的行前面插入文本
    a :在被指定的行的下面插入文本
    :换行
    r 文件:在指定位置把另外一个文件的内容插入
    w 文件:将符合条件的所有行保存至指定文件中
    =:显示符号条件的行的行号
    s///:查找条件可以使用模式,但是要替换的内容不行

    地址定界:自定义的起始行到结束行
    startline,endline
    1,3
    /pat1/,/pat2/
    /pattern/

    用法:sed [options] 'addr1[,addr2]编辑命令' FILE...
    sed [options] "addr1[,addr2]编辑命令" FILE...

    正则表达式:
    基本的
    字符:
    .
    []
    [^]
    次数
    *
    ?
    {m,n}
    锚定:
    ^
    $
    <,
    >,
    分组:
    ()
    引用:
    1,2,……
    扩展:
    字符:
    .
    []
    [^]
    次数
    *
    ?
    {m,n}
    +
    锚定:
    ^
    $
    <,
    >,
    或:
    a|b
    分组:
    ()
    引用:
    1,2,……
    sed '地址定界s@查找条件@替换文件@'
    修饰符:
    g:global,全局替换
    i:ignore-case,不区分字符大小写

    举几个栗子:
    跨步删除:
    sed '1 ~ 2 d' passwd

    cat a
    to
    tom aaa bbbtomaaa
    111 tom aaaTOm cccc
    aaaatomaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaatom
    aaaa tom123 bbbbbb cccc
    vvvv tom123457894 dddd
    tooooooooooom fffff
    tttttom rrrr
    gggg tom1 y
    jjjj kkkk lllll
    ggggggggggggggggg
    0000000000000000
    栗子开始:
    删除tom所在的行
    sed -n '/tom/d;p' a

    删除tom开头tom结尾的行
    sed -n '/^tom/,/tom$/d;p' a
    to

    [root@iZ94h902cjhZ tmp]# sed -n '/<to/d;p' a 删除单词有to开头的行
    aaaatomaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaatom
    [root@iZ94h902cjhZ tmp]# sed -n '/om>/d;p' a 删除是om结尾的行
    to
    aaaatomaaaaaaaaa
    [root@iZ94h902cjhZ tmp]# sed -n '/<tom>/d;p' a 删除有tom这个单词的行
    to
    aaaatomaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaatom

    sed '/tom/,$d' a 从tom 到最后一行之间的内容删除
    to

    sed替换
    sed 's/old/new/标签' file

    sed 's/tom/TOM/2' a 替换第二个tom 标签是几就操作第几个字符
    to
    tom aaa bbbTOMaaa
    111 tom aaaTOm cccc

    find /usr/local -maxdepth 2 -type d | sed -n 's//usr/local/man//usr/share/man/p' 替换路径
    /usr/share/man
    /usr/share/man/man3

    find /usr/local -maxdepth 2 -type d | sed -n 's!/usr/local/man!/usr/share/man!p'
    /usr/share/man
    /usr/share/man/man3

    b=/usr/share/man 引用shell里面的变量 需要在sed里面加上单引号
    find /usr/local -maxdepth 2 -type d | sed -n 's!/usr/local/man!'$b'!p'
    /usr/share/man
    /usr/share/man/man3

    [root@iZ94h902cjhZ tmp]# sed '3,7{s/tom/TOM/;s/[0-9]/wwww/g}' a 首先指定范围3-7行然后在大括号里执行多条命令
    to
    tom aaa bbbtomaaa
    wwwwwwwwwwww TOM aaaTOm cccc
    aaaaTOMaaaaaaaaa
    aaaaaaaaaaaaaaaaaaaaaTOM
    aaaa TOMwwwwwwwwwwww bbbbbb cccc
    vvvv TOMwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww dddd
    tooooooooooom fffff
    tttttom rrrr
    gggg tom1 y
    jjjj kkkk lllll
    ggggggggggggggggg
    00000000000000000

    old/new/标签 file
    old位置可以用正则,new的位置不能用正则但是可以使用:
    sed -n '3 s/tom/&/p' a
    111 tom aaaTOm cccc &表示old的值

    sed -n '3 s/tom/tUaaaaaaaaaaa/gp' a
    111 tAAAAAAAAAAA aaaTOm cccc U 把U后面的值全部换成大写

    sed -n '3 s/tom/tuaaaaaaaaaaa/gp' a
    111 tAaaaaaaaaaa aaaTOm cccc u 后面第一个换成大写

    sed -n '3 s/tom/tLAAAAAAAAAAA/gp' a
    111 taaaaaaaaaaa aaaTOm cccc L 把后面大写的全部换成小写

    sed -n '3 s/tom/tlAAAAAAAAAAA/gp' a
    111 taAAAAAAAAAA aaaTOm cccc l只替换第一个
    E 中止操作

    sed -n 's/(ro)(ot)/2/p' passwd group分组 #这里引用第二部分就是ot
    ot,x:0:0:root:/root:/bin/bash

    sed -n 's/(ro)(ot)/12/p' passwd
    root,x:0:0:root:/root:/bin/bash 引用第一和第二部分

    sed -n '$ a zhe shi xin tian jia de yi hang' a
    zhe shi xin tian jia de yi hang a在指定的行下面添加一行
    i 在指定行的上一行添加
    sed -n '/root/ c a' passwd
    a c替换整行

    sed -n '/root/r /etc/hosts' passwd r将文件读取到匹配行的后面
    127.0.0.1 iZ94h902cjhZ localhost
    ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
    10.116.93.93 iZ94h902cjhZ
    #120.131.68.199 app.hexindai.com
    120.131.68.200 app.hexindai.com
    47.88.21.177 www.iteemo.org

  • 相关阅读:
    判断qq浏览器和uc浏览器?
    做前端能避免的错误总结
    css布局
    border-radius后面写px/rem与百分比有什么区别?
    vertical-align
    localstorage和cookie的设置方法和获取方法
    怎么让列表的文字只显示两行,多出的出现省略号?
    avalon在公共页面里面写的功能,怎么让某些页面不引用到这个方法和html?
    小程序
    webpack
  • 原文地址:https://www.cnblogs.com/iteemo/p/4892331.html
Copyright © 2020-2023  润新知