regex - sed:删除两个模式之间的字符串,使第二个模式保持不变(包括一半)

标签 regex filter sed awk

我试图过滤掉两种模式之间的文本,我看过十几个例子,但没有得到我想要的:

样本输入:

START LEAVEMEBE text
   data
START DELETEME text
   data
   more data
   even more
START LEAVEMEBE text
   data
   more data

START DELETEME text
   data
   more

SOMETHING that doesn't start with START
@ sometimes it starts with characters that needs to be escaped...

我想留在:
START LEAVEMEBE text
   data
START LEAVEMEBE text
   data
   more data


SOMETHING that doesn't start with START
@ sometimes it starts with characters that needs to be escaped...

我尝试使用以下命令运行 sed:
sed 's/^START DELETEME/,/^[^ ]/d'

并得到了包容性删除,我尝试添加“排除项”(不确定我是否真的理解这个语法):
sed 's/^START DELETEME/,/^[^ ]/{/^[^ ]/!d}'

但是我的“START DELETEME”行仍然存在(是的,我可以将其删除,但这很丑陋:)此外 - 它也确实删除了此示例中的空行,如果它们是,我想留下空行我的结束模式完好无损)
我想知道是否有办法用单个 sed 命令来做到这一点。
我有一个很好的 awk 脚本:
BEGIN { flag = 0 }
        {
                if ($0 ~ "^START DELETEME")
                        flag=1
                else if ($0 !~ "^ ")
                        flag=0

                if (flag != 1)
                        print $0
        }

但是如您所知,“A 代表像蜗牛一样运行的 awk”。它需要永远。

提前致谢。
戴夫。

最佳答案

在 sed 中使用循环:

sed -n '/^START DELETEME/{:l n; /^[ ]/bl};p' input

关于regex - sed:删除两个模式之间的字符串,使第二个模式保持不变(包括一半),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17080787/

相关文章:

javascript - 如何从javascript中的字符串中提取id?

python - 如何删除非 ASCII 字符但保留句点和空格?

linux - 使用 BASH 注释间隔

linux - Unix sed XML 配置编辑

javascript - AngularJS ngRepeat - 使用复选框按单个对象属性过滤列表

linux - 如何用 Shell 脚本替换 .txt 文件中未确定位置的字符串?

正则表达式字母数字字符串丢弃最后 3 位数字和最终的初始 0

javascript - 在 js 上用正则表达式更改除第 n 个换行符之外的每个换行符

php -\w 取决于编码?

r - 选择第一个正面事件