gpt4 book ai didi

regex - sed:删除上一行

转载 作者:行者123 更新时间:2023-12-05 00:00:43 26 4
gpt4 key购买 nike

我需要在匹配之前删除一个空行。

所以给定文件:

random text
more random text






#matchee

我需要匹配模式/#matchee/,然后删除它前面的空行。

这是我尝试过的 --- 没有成功:
sed '/^[ \t]*$/{N;/#matchee.*$/{D;}}' file.txt

我的逻辑:
  • 如果是空行;将下一行附加到模式空间产生/blank line\n...etc/
  • 如果模式空间包含/#matchee/,删除直到换行符/#matchee/

  • 基本上/matchee/是一个必须维护的常量,我需要删除一个额外的
    由/#matchee/分隔的记录文件中每条记录的空行。

    这不会产生任何效果。我是 RTFM 和 D应该删除模式
    空间直到换行符。自 N附加换行符和下一行 --- 这应该会产生所需的结果......唉......没有,再没有。这是因为匹配基本上不包含任何内容(空白行)吗?

    最佳答案

    如果有奇数个空行,您的方法将有效,但如果有偶数行,它将失败。您的 sed脚本是以下循环。

  • 抓取一行 L1,并将其添加到模式空间
  • 如果 L1 非空白,则打印它;但如果它是空白的,那么:
  • 获取另一行 L2,并将其添加到模式空间
  • 如果 L2 包含 #matchee ,从模式空间
  • 中丢弃 L1
  • 打印由 L1 和 L2 或仅由 L2 组成的模式空间

  • 你会注意到 L2 总是被打印出来,即使它是空白的并且后面跟着一行包含 #matchee .它受到以下事实的保护:它紧跟在奇数个空行之后。

    编辑添加:要解决上述问题,您可以使用 : 添加一个内循环。创建标签的命令和 b命令“分支”到它(转到)。这个:
    sed '/^[ \t]*$/{: a;N;/#matchee/!P;D;/^[ \t]*$/b a}' file.txt

    是以下循环:
  • 抓取一行 L1,并将其添加到模式空间
  • 如果 L1 非空白,则打印它;但如果它是空白的,那么:
  • 创建标签 a ← 这是一个无操作,只是一个地方 goto
  • 获取另一行 L2,并将其添加到模式空间
  • 如果 L2 不包含 #matchee , 打印 L1
  • 从模式空间中丢弃 L1(无论我们是否打印它)
  • 我们现在可以将 L2 视为 L1;它是模式空间中唯一的东西
  • 如果重新命名的 L1 为空白,则 goto a
  • 关于regex - sed:删除上一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9641442/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com