用shell脚本删除一些文本?

时间:2018-11-26 20:52:06

标签: shell scripting cygwin

我想获得有关如何使用cygwin的帮助,该软件具有bash来编写以下脚本:

我有一个包含以下内容的txt文件:

action "action1"
  reset
  type xformbin
  http-method-limited POST
  http-method-limited2 POST
exit

action "action2"
  reset
  admin-state disabled
  type results
  http-method-limited POST
  http-method-limited2 POST
exit

action "action3"
  reset
  admin-state disabled
  type setvar
  http-method-limited POST
  http-method-limited2 POST
exit

我希望可以编写一个shell脚本来删除admin-state = disabled的块?

因此,我希望可以遍历txt文件,如果admin-state = disable,请从该特定块中删除“操作”和“退出”之间的所有内容。

我希望从示例文本中获得以下最终结果:

action "action1"
  reset
  type xformbin
  http-method-limited POST
  http-method-limited2 POST
exit

谢谢。

2 个答案:

答案 0 :(得分:0)

您有perl吗?

local $/="exit";
while (<>) {
    print if not /admin-state disabled/;
}

答案 1 :(得分:0)

因此,如果整个块在中间处于“禁用”状态,则希望将其忽略,但如果没有,则将其打印出来。

sed -n '
  /action/,/exit/ {
  /action/ { x; d; }
  H;
  /exit/ { x;
    /disabled/ d;
    p;         d;
  }
}' x

除非从actionexit的一个区块中,否则此操作将无效。在那些-

如果一行中有action,请将其存储并删除模式空间以触发下一次读取。

否则,将行添加到存储的保留空间中。

如果该行包含exit

  • 将保留空间交换到模式空间
  • 如果收集的模式具有disabled,请将其删除以触发读取下一条记录;
  • 如果没有,请打印它,然后将其删除以触发读取下一条记录。

输出:

$: sed -n '
  /action/,/exit/ {
    /action/ { x; d; }
    H;
    /exit/ { x;
      /disabled/ d;
      p;         d;
    }
  }' infile
action "action2"
reset
admin-state enabled
type xform
http-method GET
http-method-limited POST
http-method-limited2 POST exit

希望有帮助。