Linux 字符串大小写中的sed匹配问题\<&燃气轮机&引用;?

Linux 字符串大小写中的sed匹配问题\<&燃气轮机&引用;?,linux,bash,shell,awk,sed,Linux,Bash,Shell,Awk,Sed,我使用下面的sed脚本删除一些与 “无约束状态;” 但问题是在某些块中我有字符串 “下一个绑定状态空闲” 和下面的命令将其视为匹配并移除它,也不想删除“下一个绑定状态”块PLZ建议。 并从输入文件中删除“无绑定状态”块 sed -e '/lease/!b;:a;/}/!{$!{N;ba}};{/\<binding state free;\>/d}' file.txt 期望输出:- lease { *****some text******

我使用下面的sed脚本删除一些与

“无约束状态;”

但问题是在某些块中我有字符串

“下一个绑定状态空闲”

和下面的命令将其视为匹配并移除它,也不想删除“下一个绑定状态”块PLZ建议。 并从输入文件中删除“无绑定状态”块

  sed -e '/lease/!b;:a;/}/!{$!{N;ba}};{/\<binding state free;\>/d}' file.txt
期望输出:-

lease {
          *****some text******
          *****some text******
          binding state active;
          next binding state free;
          rewind binding state free;
          *****some text******
          *****some text******
        }
        lease {
          *****some text******
          *****some text******
          binding state active;
          next binding state free;
          rewind binding state free;
          *****some text******
          *****some text******
        }

我相信你能在sed中做到,但是这个想法让我害怕。我建议使用awk脚本:

# match start of block
$1 == "lease" {
    n = 1
    should_print = 1
}

# save every line in the buffer
{
    buffer[n++] = $0
}

# unset the print flag if text is matched
/^[[:blank:]]*binding state free;[[:blank:]]*$/ {
    should_print = 0
}

# match end of block
$1 == "}" && should_print {
    for (i = 1; i < n; ++i) {
        print buffer[i]
    }
}
如果您对输出满意,可以使用标准方法覆盖输入:

awk -f script.awk file > tmp && mv tmp file
这可能适用于您(GNU-sed):

使用类似grep的选项
-n
仅打印所需内容。收集
租约{
和以
}
结尾之间的行。如果集合中的任何一行包含
无绑定状态
,而没有其他内容,请不要打印集合


注意:使用
M
多行标志来定制regexp。

当您使用和使用值
RS
RT
时,这可以很容易地完成

RS
输入记录分隔符。它的默认值是字符串 包含单个换行符,这意味着输入 记录由一行文本组成。它也可以是空值 字符串,在这种情况下,记录由多行空行分隔。如果 它是一个regexp,记录由中regexp的匹配项分隔 输入文本。(见附件。)

(gawk扩展)
RS
作为正则表达式的能力是
gawk
扩展。在里面 大多数其他awk实现,或者如果
gawk
处于兼容模式 (请参阅),仅使用
RS
值的第一个字符

RT
(gawk扩展名)
匹配以下所示文本的输入文本
RS
,记录分隔符。每次读取记录时都会设置它

如果您想在sed中执行此操作,我将采用稍微不同的方法

sed '/lease {/ {:a;N;/}/!ba;/\n *binding state free;/!p; };d;' <file>

它总是在队伍的开头吗?使用
^无绑定状态
awk
中,您可以编写
/binding state free;/&&/下一个无约束状态/
@Barmar no-its在块中您还想删除
自由倒带绑定状态
?还有其他可能性吗?Perl模式下的负查找还是正查找?我想从输入文件中删除该数据。我编辑了我的答案以显示如何修改原始文件。sed-e'/lease{/{:a;N;/}/!ba;/\N*绑定状态活动;/!p;};d、 "file.txt我正在尝试运行此程序,但无法运行@kvantour@Vijay请你定义一下:不工作。我只是再试了一次,它在我的系统上运行得很好。我唯一能想象的是,您的原始文件中可能有制表符。这可能有效
sed'/lease[[:blank:]*{/{{:a;N;/}/!ba;/\N[:blank:]*无绑定状态;/!p;};d、 "
awk -f script.awk file > tmp && mv tmp file
sed -n '/lease {/{:a;N;/}/!ba;/^\s*binding state free;\s*$/M!p}' file
awk 'BEGIN { RS="lease *{|}" }
     (RT=="}") && (!/\n *binding state free;/)){ print RTO $0 RT }
     {RTO=RT}' <file>
lease {
      *****some text******
      *****some text******
      binding state active;
      next binding state free;
      rewind binding state free;
      *****some text******
      *****some text******
    }
lease {
      *****some text******
      *****some text******
      binding state active;
      next binding state free;
      rewind binding state free;
      *****some text******
      *****some text******
    }
sed '/lease {/ {:a;N;/}/!ba;/\n *binding state free;/!p; };d;' <file>
   lease {
      *****some text******
      *****some text******
      binding state active;
      next binding state free;
      rewind binding state free;
      *****some text******
      *****some text******
    }
    lease {
      *****some text******
      *****some text******
      binding state active;
      next binding state free;
      rewind binding state free;
      *****some text******
      *****some text******
    }