bash - sed 查询以编辑 yaml 文件

jay*_*ker 3 vim bash sed

我有一个 config.yaml 文件,其中包含以下我想使用 bash 脚本从配置中删除的 kafka 代理列表。

kafka.brokers:
    - "node003"
    - "node004"
Run Code Online (Sandbox Code Playgroud)

我目前通过使用以下命令从脚本内部调用vi来执行此操作:

vi $CONF_BENCHMARK/config.yaml -c ":%s/kafka.brokers:\(\n\s*-\s".*"\)*/kafka.brokers:/g" -c ':wq!'
Run Code Online (Sandbox Code Playgroud)

我知道sed是完成相同任务的更合适的工具,但是当我尝试将上述正则表达式转换为sed 时,它不起作用。

sed -i -e "s/kafka.brokers:\(\n\s*-\s".*"\)*/kafka.brokers:/g" $CONF_BENCHMARK/config.yaml
Run Code Online (Sandbox Code Playgroud)

我做错了什么?

kar*_*kfa 6

awk 来救援!

sed 是基于行的,这应该有效......

$ awk 's{if(/\s*-\s*"[^"]*"/) next; else s=0} /kafka.brokers:/{s=1}1' file
Run Code Online (Sandbox Code Playgroud)

解释

if(/\s*-\s*"[^"]*"/) next 如果模式匹配,则跳到下一行
s{if(/\s...检查模式,如果仅设置了 s,则设置
/kafka.brokers:/{s=1}s
1打印行的简写(如果未跳过)
s{... else s=0}如果设置了 s 但未找到模式,则重置 s

  • 它按原样打印内容,即它没有做任何更改。 (2认同)