bash - 编辑 yaml 文件的 sed 查询

标签 bash vim sed

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

kafka.brokers:
    - "node003"
    - "node004"

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

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

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

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

我做错了什么?

最佳答案

awk 助您一臂之力!

sed 是基于行的,这应该可以...

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

解释

if(/\s*-\s*"[^"]*"/) next if pattern matches skip to next line
s{if(/\s... check pattern if only s is set
/kafka.brokers:/{s=1} when header seen set s
1 shorthand for print lines (if not skipped)
s{... else s=0} if s was set but pattern not found, reset s

关于bash - 编辑 yaml 文件的 sed 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41214611/

相关文章:

ruby-on-rails - Vim 中 ERB 标签的缩进

sed - 匹配模式附加行但排除模式行

linux - 使用 awk 获取特定的字符串

vim - 如何更改 vim 状态行颜色?

vim - 添加对 `ci|` 和 `da|` 的支持(选择管道内的文本)

regex - 使用 sed 提取 XML 文件的元素内容

linux - 为什么不同的环境在调用man -ls 时包含不同的命令行选项? (环境 : codecademy, cb.vu)

linux - 后台接地和子处理期间的可变可访问性

Linux bash shell 脚本 - 文件名中的空格

linux - BASH: 发送 SIGTSTP 信号 (ctrl+z)