首页 > 解决方案 > sed 删除花括号之间的部分

问题描述

由于缺少其他选项,我正在尝试从配置文件中删除一个部分 elasticsearch { * }。

output {
  if [env] {
      if [containerimage] and [containerimage] != "apache" {
        file {
          path => "/var/log/logstash/logs/%{[env]}/%{file}-%{+YYYY-MM-dd}"
        }
        elasticsearch {
          hosts => ["{{elasticsearch/host}}:{{elasticsearch/port}}"]
          template_overwrite => true
       } 
  }
 }
}

我试图反转在 stackoverflow 上找到的 sed 命令,但它也从配置文件中删除了结尾 }。

[root@indexer conf.d]# sed '/{/{:1; /}/!{N; b1}; /elasticsearch/!p}; d' example              
output {
  if [env] {
      if [containerimage] and [containerimage] != "apache" {
        file {
          path => "/var/log/logstash/logs/%{[env]}/%{file}-%{+YYYY-MM-dd}"

这可能是由于 }} 必须存在于 cfg 中。有什么想法可以克服这个问题吗?提前致谢

编辑:

其他一些实验:

sed '/elasticsearch {/{:1; /}/!{N; b1} }; /elasticsearch/!p; d' example 
output {
  if [env] {
      if [containerimage] and [containerimage] != "apache" {
        file {
          path => "/var/log/logstash/logs/%{[env]}/%{file}-%{+YYYY-MM-dd}"
        }
                  template_overwrite => true
            } 
           }
  }
}

但留下了 template_overwrite 和一些右括号。

标签: sed

解决方案


这可能对您有用(GNU sed):

sed '/^\s*elasticsearch {$/{:a;N;/^\s*}$/M!ba;d}' file

收集开始elasticsearch {和结束的行}并删除它们。

注意这使用M标志进行多行匹配,以匹配 GNU sed 特定的结束条件。替代:

sed -n '/^\s*elasticsearch {$/{:a;n;/^\s*}$/!ba;d};p' file

推荐阅读