zoukankan      html  css  js  c++  java
  • sed基本用法

    命令格式解析

    1.常见命令选项

     -n 屏蔽默认输出

     -i 直接修改文本内容

     -f 使用sed脚本

     -e 可指定多个处理动作

     -r 启用扩展正则表达式,若与其他选项一起使用,应把r放在最前

     -{} 可组合多个命令,以分号分割

    sed 元字符
      ^ 匹配行开始,如:/^sed/匹配所有以sed开头的行。
      $ 匹配行结束,如:/sed$/匹配所有以sed结尾的行。
      . 匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d。

      匹配0个或多个字符,如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
      [] 匹配一个指定范围内的字符,如/[ss]ed/匹配sed和Sed。
      [^] 匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
      (..) 匹配子串,保存匹配的字符,如s/(love)able/1rs,loveable被替换成lovers。
      & 保存搜索字符用来替换其他字符,如s/love/&/,love这成love。
      < 匹配单词的开始,如:/<love/匹配包含以love开头的单词的行。
      > 匹配单词的结束,如/love>/匹配包含以love结尾的单词的行。
      x{m} 重复字符x,m次,如:/0{5}/匹配包含5个0的行。
      x{m,} 重复字符x,至少m次,如:/0{5,}/匹配至少有5个0的行。
      x{m,n} 重复字符x,至少m次,不多于n次,如:/0{5,10}/匹配5~10个0的行。

    sed替换标记:
      g表示全局替换
      1表示前面第一个左括号所表示的内容,2表示前面第二个左括号中表示的内容,以此类推
      &表示前面匹配到的内容

    基本的处理动作

    p  打印行     4,6p  输出4,5,6行
     4p,6p  输出4行,6行
    d  删除行  4,6d  删除4,5,6行
    s  字符串替换 s/old/new/  将每行的第一个old替换成new 
    s/old/new/3  将每行的第三个old替换成new 
    s/old/new/g  将全部的old替换成new 

    替换操作的分隔符"/"可以用其他字符代替,如&,#,便于修改文件路径

    输出文本
    sed -n 'p' aa.txt 输出所有行,相当于cat aa.txt相同
    sed -n '6p' aa.txt 输出第6行
    sed -n '4,7p' aa.txt 输出4,5,6,7行
    sed -n '4,+5p' aa.txt 输出第4行以及其后的5行
    sed -n '/^root/p' aa.txt 输出以root开头的行
    sed -n 'p;n' aa.txt 输出奇数行,n表示读取下一行文本
    sed -n 'n;p' aa.txt 输出偶数行,n表示读取下一行文本
    sed -n '5,${n,p}' aa.txt 输出从第五行至文件末尾的所有偶数行
    sed -n '$=' aa.txt 输出文件的行数
    sed  -e '$!N;/ .*gps ok/P;D' aa.txt 检索包含“gps ok”行的上一行
    sed  -ne '/then/{n;p}' aa.txt 输出包含then行的下一行
    sed  -ne '/then/{n;p;n;p}' aa.txt 输出包含then行的下面两行
    sed  -ne '/then/{n;p;n;p;n;p}' aa.txt 输出包含then行的下面三行
    删除文本
    sed -n '4,7d' aa.txt 删除4,5,6,7行
    sed -n '4,$d' aa.txt 删除第3行到最后一行
    sed -n '/bin/d' aa.txt 删除包含bin的行
    sed -n '/bin/!d' aa.txt 删除不包含bin的行,!表示取反
    sed -n '/^bin/d' aa.txt 删除以bin开头的行
    sed -n '/^$/d' aa.txt 删除所有空行
    sed -n '/^$/{n;/^$/d}' aa.txt 删除重复空行,连续的空行只保留一个
    sed  -i -e '$!N;/ .*gps ok/!P;D' aa.txt 删除包含“gps ok”行的上一行
    替换文本
    sed -n 's/aa/AA/' aa.txt 将每行中的第一个aa替换成AA
    sed -n 's/aa/AA/4' aa.txt 将每行中的第4个aa替换成AA
    sed -n 's/aa/AA/g' aa.txt 将文本所有的aa替换成AA
    sed -n 's/aa//g' aa.txt 将文本所有的aa替换成空,相当于删除
    sed -n 's/aa/&s/g' aa.txt 将文本所有的aa替换成aas,&表示查找到的字符
    sed -n '4,6s/^/#/' aa.txt 将文本4,5,6行的开头加上#,相当于注释代码
    sed -n '4,6s/^#//' aa.txt 将文本4,5,6行的开头#号去掉,相当于删除注释

    sed的文本块处理 

    操作符 用途 命令示范
    i 行前插入文本 2iAA,在第2行前面插入文本行AA
    2,4iAA,在第2-4行每行前面插入文本行AA
    a 行后插入文本 2aAA,在第2行后面插入文本行AA
    2,4aAA,在第2-4行每行后面插入文本行AA
    c 替换当前行 2cAA,把第二行内容替换成AA

    导入到处操作

    操作符 用途 命令示范 解释
    r 读取文本 2r a.txt 在第2行的下面插入a.txt文件
    2,4r a.txt 在第2-4行每行下面插入a.txt文件
    w 保存到文件 2w a.txt 将第2行的内容保存为a.txt文件
    2,4w a.txt 将第2-4行的内容保存为a.txt文件

    多行模式和单行模式

      多行模式空间命令有(N、D、P),他们分别对应单行模式空间(n、d、p)  
      d每次删除一行,而D每次删除多行模式空间中的“一行”,其实就是一个记录。
      ^就不是表示行的开头,而是模式空间里的开头,$也不是行的结尾了,而是模式空间里的结尾
      n:读取匹配模式的行的下一行到模式空间中.注:模式空间中匹配模式的行被删除。
      N:读取匹配模式的行,和匹配模式行的下一行。

    sed复制剪切

    模式空间

      -存放当前处理的行,将处理的结果输出

      -若当前行不符合处理条件,则原样输出

      -处理完当前行再读入下一行进行处理

    保持空间

      -类似于windows的剪切板

      -默认存放一个空行(换行符 )

    基本动作

      复制

      H:模式空间--->追加--->保持空间

      h:模式空间--->覆盖--->保持空间

      粘贴

      G:保持空间--->追加--->模式空间

      g:保持空间--->覆盖--->模式空间

    示范

    1)把1-3行复制到文件末尾

    [root@localhost ~]# cat a.txt
    111
    222222
    333333333
    444444444444
    [root@localhost ~]# sed '1,3H;$G' a.txt  #此处有空行时因为第一次是在保持空间里追加,而保持空间默认有一个空行,注意理解H和h,G和g的区别
    111
    222222
    333333333
    444444444444
    
    111
    222222
    333333333
    [root@localhost ~]# sed '1h;2,3H;$G' a.txt  #此处没有空行,因为第一次是覆盖保持空间的空行
    111
    222222
    333333333
    444444444444
    111
    222222
    333333333

    2)把第一行剪切到文件末尾

    [root@localhost ~]# sed '1h;1d;$G' a.txt
    222222
    333333333
    444444444444
    111

    3)把第1,2行剪切到文件末尾

    [root@localhost ~]# sed '1h;2H;1,2d;$G' a.txt
    333333333
    444444444444
    111
    222222

     !取反操作

    1)列出不使用bash的用户有哪些

    [root@localhost ~]# sed -n '/bash$/!p' /etc/passwd
    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
    uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
    operator:x:11:0:operator:/root:/sbin/nologin
    games:x:12:100:games:/usr/games:/sbin/nologin
    gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
    ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
    nobody:x:99:99:Nobody:/:/sbin/nologin
    dbus:x:81:81:System message bus:/:/sbin/nologin
    vcsa:x:69:69:virtual console memory owner:/dev:/sbin/nologin
    saslauth:x:499:76:Saslauthd user:/var/empty/saslauth:/sbin/nologin
    postfix:x:89:89::/var/spool/postfix:/sbin/nologin
    sshd:x:74:74:Privilege-separated SSH:/var/empty/sshd:/sbin/nologin

     修改启动项

    [root@localhost ~]# sed  '/^id/s/[0-6]/3/g' /etc/inittab
    id:3:initdefault:

    其他复杂使用

    1)删除文件中每行的第二个、最后一个字符

    分两次替换操作,第一次替换掉第2个字符,第二次替换掉最后一个字符:

    [root@localhost ~]# sed 's/.//2;s/.$//' a.txt

    2)删除文件中每行的第二个、最后一个单词

    分两次替换操作,第一次替换掉第2个单词,第二次替换掉最后一个单词:

    [root@localhost ~]# sed -r 's/[a-Z]+//2;s/[a-Z]+([^a-Z]*)$/1/' a.txt

    3)将文件中每行的第一个、第二个字符互换

    每行文本拆分为“第1个字符”、“第2个字符”、“剩下的所有字符”三个部分,然后通过替换操作重排顺序为“2-1-3”:

    [root@localhost ~]# sed -r 's/^(.)(.)(.*)/213/' a.txt

    4)将文件中每行的第一个、第二个单词互换

    每行文本拆分为“第1个单词”、“单词分隔”、“第2个单词”、“剩下的所有字符”四个部分,然后通过替换操作重排顺序为“3-2-1-4”:

    [root@localhost ~]# sed -r 's/([a-Z]+)([^a-Z]*)([a-z]+)(.*)/3214/' a.txt

    5)删除文件中所有的数字、行首的空格

    因原文件内没有数字,行首也没有空格,这里稍作做一点处理,生成一个新测试文件:

    [root@localhost ~]# sed 's/o/o7/;s/l/l4/;3,5s/^/  /' a.txt > b.txt

    6)删除所有数字、行首空格的操作

    [root@localhost ~]# sed -r 's/[0-9]//g;s/^( )+//' a.txt

    7)为文件中每个大写字母添加括号

    使用“&”可调用s替换操作中的整个查找串,所以可参考下列操作解决:

    [root@localhost ~]# sed 's/[A-Z]/(&)/g' a.txt

      或者

    [root@localhost ~]# sed -r 's/([A-Z])/(1)/g' a.txt

     8)取后三位

    echo "SYBASE4"|sed 's/.*(...)$/1/'
    
    //取后四位
    echo "SYBASE4"|sed 's/.*(....)$/1/'

     9) 删除某个字符串前面的字符

    sed -i 's/^.*Server received message ://' all.log.2021-06-03
  • 相关阅读:
    关于浏览器类型和版本号的思考
    safari浏览器cookie问题
    整理轻量级的前端分离规范
    【jquery插件】-网页下雪效果
    剑指offer——面试题15.2:判断两个整数m和n的二进制中相差多少位
    剑指offer——面试题15.1:判断一个数是否为2的整数次方
    剑指offer——面试题15:二进制中 1的个数
    剑指offer——面试题14:剪绳子
    剑指offer——面试题11:旋转数组的最小数字
    剑指offer——面试题11:快速排序
  • 原文地址:https://www.cnblogs.com/linyouyi/p/9767660.html
Copyright © 2011-2022 走看看