【发布时间】:2018-07-18 04:01:07
【问题描述】:
假设您有大量 yaml 文件(或任何类似文件),并且您想为所有具有给定名称的对象添加描述,例如
- name: alan
age: 8
- name: britney # some comment about britney
hobbies: ["painting", "CS"]
age: 21
- name: charles # some comment about charles
# that spans over multiple lines
age: 42
我有一个需要描述名称的对象列表,例如
britney: teamblue
charles: foobar
如何添加带有描述的行以达到以下目的:
- name: alan
age: 8
- name: britney # some comment about britney
hobbies: ["painting", "CS"]
age: 21
description: teamblue
- name: charles # some comment about charles
# that spans over multiple lines
age: 42
description: foobar
到目前为止,我已经很接近了,但我总是无法用另一个纯文本替换多行文本:
s=$(awk "/${name}/" RS= ./*.yml)
r=$(awk "/${name}/" RS= ./*.yml && echo " description: ${desc}")
我需要以某种方式寻找$s 并将其替换为$r,但我无法使其工作。我尝试了以下两种的多种变体:
sed "s/$s/$r/" ./*.yml
perl -i -0pe "s/$s/$r/" ./*.yml
但不知何故,yaml 中的特殊字符(换行符、双引号等)会破坏它们,我要么收到类似 unterminated substitute pattern 的错误消息,要么输出相同,但没有匹配。
也可能与sed 相关,我使用的是 macOS。
【问题讨论】:
-
使用 YAML 解析器。
-
使用解析器,我想我会丢失文件中的所有 cmets 和格式。
-
哪种格式? YAML 是一种机器可读的格式。格式无关紧要。我相信应该有一个理解 cmets 的解析器。我敢肯定,很快就会有更多 YAML 知识的人出现。但是在没有解析器的情况下这样做意味着您必须构建自己的解析器。
-
为什么
hobbies的行下移了? -
@ATN, Re "我不需要解析器",根据定义,你需要一个解析器。您要编写的是解析器。问题是您正在编写的解析器很糟糕。更糟糕的是,您暗示这是手写的 YAML,因此用户可以提供任何合法的 YAML,而所提供的答案都无法做到这一点。你知道有效的 JSON 就是有效的 YAML 吗?