• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sjmcefc2
V2EX  ›  程序员

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

  •  
  •   sjmcefc2 · Apr 10, 2021 · 3530 views
    This topic created in 2033 days ago, the information mentioned may be changed or developed.
    如题:
    aaa
    123
    123
    123
    123
    123
    eee


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

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

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

    #!/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
    no1xsyzy
    Apr 10, 2021
    14
    (啊,如果最后一行结尾不在第一列是没有 line break 的,忘记那句 assert 吧
    smyle
    smyle
    Apr 10, 2021
    15
    sed '/aaa/,/eee/d' $文件名
    意思就是删除 aaa 到 eee 之间的所有行(正则匹配,包括 aaa 和 eee 本身)

    如果要保留 aaa 和 eee 这两行的话
    sed '/aaa/,/bbb/{/aaa/!{/bbb/!d}}' $文件名
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1455 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 36ms · UTC 22:58 · PVG 06:58 · LAX 14:58 · JFK 17:58
    ♥ Do have faith in what you're doing.