• sed 学习笔记(转)


    声明:这些代码只是为了学习和理解sed命令而为之,并不代表问题的唯一解或最佳解,希望各位拍砖
    参考资料:<sed&awk.pdf>等
    一. 替换

    1.神奇变换(y命令的使用)
    代码:
    sed 'y/ori_letter_list/target_letter_list/' filename


    代码:
    cat filename
    1234567890
    2345678901
    3456789012
    4567890123
    测试
    将文件中1换成A
    将文件中2换成B
    ...
    将文件中0换成J
    代码:
    sed 'y/1234567890/ABCDEFGHIJ/' filename
    ABCDEFGHIJ
    BCDEFGHIJA
    CDEFGHIJAB
    DEFGHIJABC
    注意变换关系是按两个list的位置对应变换,y是一个管局命令,拒绝使用后缀flag/g
    list1:1234567890
    list2:ABCDEFGHIJ
    下面再作一个与前例相反的变换
    代码:
    sed 'y/0987654321/ABCDEFGHIJ/' filename
    JIHGFEDCBA
    IHGFEDCBAJ
    HGFEDCBAJI
    GFEDCBAJIH


    2.替换每行第一个匹配

    代码:
    sed 's/regexpr/anyword/' filename
    sed 's/regexpr/anyword/1' filename

    举例:
    引用:
    cat filename
    1234567890 2345678901
    3456789012 4567890123
    sed 's/5/五/' filename
    1234五67890 2345678901
    34五6789012 4567890123


    3.替换每行第n(如果有的话)个匹配

    代码:
    sed "s/regexpr/anyword/${n}" filename
    cat filename
    111111111111111111
    222222222222222222
    333333333333333333
    444444444444444444
    举例
    sed "s/4/ 四 /8" filename
    111111111111111111
    222222222222222222
    333333333333333333
    4444444 四 4444444444


    4.替换每行所有匹配

    代码:
    cat filename
    1234567890 2345678901
    3456789012 4567890123

    代码:
    举例:
    sed 's/3/三/g' filename
    12三4567890 2三45678901
    三456789012 456789012三


    二.行号处理

    1.为文件加行号
    代码:
    sed = filename|sed 'N;s/\n/:/'
    cat filename
    111111111111111111
    222222222222222222
    333333333333333333
    444444444444444444

    举例
    代码:
    sed = filename|sed 'N;s/\n/:/' filename
    1:111111111111111111
    2:222222222222222222
    3:333333333333333333
    4:444444444444444444


    2.仅为文件中的正文行加行号

    代码:
    sed /./= a|sed '/./N;s/\n/:/'

    举例
    代码:
    cat filename
    111111111111111111

    222222222222222222
    333333333333333333

    444444444444444444

    sed /./= a|sed '/./N;s/\n/:/' filename
    1:111111111111111111

    3:222222222222222222
    4:333333333333333333

    6:444444444444444444


    三.字串翻转

    代码:
    sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'

    举例
    代码:
    echo 1234567890|sed '/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//'
    0987654321


    四.选择性输出

    1.打印文档奇数行(隔行输出)

    代码:
    sed 'n;d'
    sed 'x;$!N;x'
    sed -n 'p;n'

    1
    3
    5
    7


    2.打印偶数行(隔行输出)

    代码:
    sed -n 'n;p'
    sed '1d;n;d;'
    2
    4
    6
    8


    3.删除连续重复行(大量使用了pattern space 文件太大时要注意)

    代码:
    sed '$!N; /^\(.*\)\n\1$/!P; D'     
    #使用 $!N 要当心内存溢出

    举例
    代码:
    cat file
    111111111111111111
    222222222222222222
    222222222222222222
    333333333333333333
    444444444444444444
    444444444444444444
    444444444444444444
    444444444444444444
    444444444444444444

    sed '$!N; /^\(.*\)\n\1$/!P; D' filename
    111111111111111111
    222222222222222222
    333333333333333333
    444444444444444444


    4.合并上下行并以空格相分隔

    代码:
    sed '$!N;s/\n/ /'

    举例
    代码:
    cat file
    1234567890
    0987654321
    执行命令后
    1234567890 0987654321


    5.将以\符号结尾的行与下行合并并以空格分隔(拼接断行)

    代码:
    sed -e :a -e '/\\$/N; s/\\\n/ /; ta'

    举例
    代码:
    cat filename
    1 111111111111111111\
    2 222222222222222222
    3 333333333333333333\
    4 444444444444444444

    sed -e :a -e '/\\$/N; s/\\\n/ /; ta' filename
    1 111111111111111111 2 222222222222222222
    3 333333333333333333 4 444444444444444444


    6.按关键字拼接行
    如果某行以=开始,则合并到上一行并替代=为空格

    代码:
    sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'

    举例
    代码:
    cat file
    111111111111111111
    222222222222222222
    =333333333333333333
    444444444444444444

    sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D' filename
    111111111111111111
    222222222222222222 333333333333333333
    444444444444444444


    7.输出匹配行的下一行

    代码:
    sed -n '/regexpr/{n;p;}' filename

    举例
    代码:
    cat filename
    1 111111111111111111
    2 222222222222222222
    3 333333333333333333
    4 444444444444444444

    sed -n '/^3/{n;p;}' filename
    4 444444444444444444


    8.显示匹配行的行号并输出匹配行的上行、匹配行、下行

    sed -n -e '/regexpr/{=;x;1!p;g;$!N;p;D;}' -e h
    举例
    代码:
    cat filename
    1 111111111111111111
    2 222222222222222222
    3 333333333333333333
    4 444444444444444444

    sed -n -e '/^3/{=;x;1!p;g;$!N;p;D;}' -e h  filename
    3                                       #匹配行的行号
    2 222222222222222222  #上一行
    3 333333333333333333  #匹配行
    4 444444444444444444  #下一行


    9.删除文档中某标志区域内的关键字匹配行

    删除文档中从being开到end结束的块中包含myword的行
    代码:
    sed '/^begin/,/^end/{/myword/d;}' filename

    引用:
    cat filename
    myword
    begin
    myword
    Number!
    myword
    Number!
    myword
    Number!
    myword
    Number!

    end
    myword
    Number!
    测试
    引用:
    myword
    begin
    Number!
    Number!
    Number!
    Number!

    end
    myword
    Number!


    五.字串解析

    1.从字串中解析出两个子串(前2各字符和后9个字符)

    代码:
    echo "WeLoveChinaUnix"|sed -e 'H;s/\(..\).*/\1/;x;s/.*\(.\{9\}\)$/\1/;x;G;s/\n/ /'
    We ChinaUnix


    2.分解日期串

    代码:
    echo 20030922|sed 's/\(....\)\(..\)\(..\)/\1 \2 \3/'|read year month day
    echo $year $month $day
    2003 09 22
  • 相关阅读:
    webAPI身份验证
    vs调试的时候debug和release的区别
    webapi put 请求405问题
    WebApi跨域问题解决
    多车轨道路径规划算法设计
    Re:从零开始学流媒体(一):视频跳转、206、chunked、动态URL、断点续传
    Java面试题总结论(二)-IOC、AOP、Spring、注解
    Java面试题总结论(一)-数据结构
    从零开始部署发布Java项目到服务器的Docker中
    10天,从.Net转Java,并找到月薪2W的工作(三)
  • 原文地址:https://www.cnblogs.com/aquester/p/9891937.html
Copyright © 2020-2023  润新知