V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sjmcefc2
V2EX  ›  程序员

sed 删除代码块,有没有一次性好办法呢?

  •  
  •   sjmcefc2 · 241 天前 · 1368 次点击
    这是一个创建于 241 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题:
    aaa
    123
    123
    123
    123
    123
    eee


    需求 是删除 aaa 开头 到 eee 结尾的代码块,
    这样需要如何写呢?
    15 条回复    2021-04-10 23:38:38 +08:00
    ppxppx
        1
    ppxppx  
       241 天前 via Android
    find . -type f | xargs sed -i 's/^aaa.*eee$//g'
    sjmcefc2
        2
    sjmcefc2  
    OP
       241 天前
    代码块是不同行的
    ^aaa 是开头吧,eee$是结尾。

    这样是不是必须要同一行才可以删除呢
    elsonwx
        3
    elsonwx  
       241 天前
    find . -type f|xargs sed -i.bak '/aaa/,/eee/d'
    yuanmomo
        4
    yuanmomo  
       241 天前 via iPhone
    @sjmcefc2 sed 可以匹配行的方式来匹配起始行号,然后操作这个行范围之内的
    Akiyu
        5
    Akiyu  
       241 天前   ❤️ 1
    sed 有多行模式. 你可以参考一下.
    那东西不仅麻烦也很少用, 一般你得自己研究.
    https://www.gnu.org/software/sed/manual/sed.html
    重点关注一下. 7.1 Joining lines
    我记得之前有用它处理过多行文本处理的问题. 应该是可行的.
    scinart
        6
    scinart  
       241 天前
    sed 从 3 删到 6, see `info sed` 6.3 Multiline techniques

    seq 9 | sed '/3/{:x; s.6.6.; tn; N; bx; :n; d;}'
    Jirajine
        7
    Jirajine  
       241 天前 via Android
    你在这里琢磨 sed 的时间,直接用 Python 已经写好了。
    sjmcefc2
        8
    sjmcefc2  
    OP
       241 天前
    python 也可以?大神赐教
    kokutou
        9
    kokutou  
       241 天前
    py 按行读取, 写入到临时文件, 遇到 aaa 就不写了,到了 eee 再继续写....
    sjmcefc2
        10
    sjmcefc2  
    OP
       241 天前
    @elsonwx 这个可行,'/aaa/,/eee/d' 里面这个,的意思是啥呢
    sjmcefc2
        11
    sjmcefc2  
    OP
       241 天前
    另外,不如我想在 aaa 和 eee 之间插入一些不同行的代码,该怎么做呢
    sjmcefc2
        12
    sjmcefc2  
    OP
       240 天前
    另外,不如我想在 aaa 和 eee 之间插入一些不同行的代码,该怎么做呢
    -----
    用\n 来换行就可以了。
    no1xsyzy
        13
    no1xsyzy  
       240 天前
    基本骨架长这样

    #!/usr/bin/env python3
    import sys
    for line in sys.stdin:
      assert line[-1] in "\r\n"
      sys.stdout.write(line)

    chmod +x 或者 python3 a <in.txt >out.txt
    然后随意改改就成。
    no1xsyzy
        14
    no1xsyzy  
       240 天前
    (啊,如果最后一行结尾不在第一列是没有 line break 的,忘记那句 assert 吧
    smyle
        15
    smyle  
       240 天前
    sed '/aaa/,/eee/d' $文件名
    意思就是删除 aaa 到 eee 之间的所有行(正则匹配,包括 aaa 和 eee 本身)

    如果要保留 aaa 和 eee 这两行的话
    sed '/aaa/,/bbb/{/aaa/!{/bbb/!d}}' $文件名
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   3923 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 37ms · UTC 05:57 · PVG 13:57 · LAX 21:57 · JFK 00:57
    ♥ Do have faith in what you're doing.