sed - 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 和一些右括号。
解决方案
这可能对您有用(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
推荐阅读
- mysql - SQL 数据库中作为主用户 ID 的特定格式
- javascript - angular & ngrx:升级到 version8 期间的问题
- python - 如何使用 selenium 和 python 在 dd 属性中提取没有名称的文本?
- javascript - 按分钟过滤数据 VueJs
- header - Rswag:授权标头出现在查询参数中
- node.js - ExpressJS - 通用响应中间件
- c++ - 理解嵌套的 lambda 表达式
- python - Python切片和替换
- firebase - 我可以将 GoogleAPI 与通过 Firebase 身份验证获取的 refresh_token 一起使用吗?
- python - 跳过在 python 中绘制 NaN 和 inf 值