YAML:从字符串到多行?
YAML: from string to multi-line?
我有一个像这样的 yaml。
有没有办法让“Corefile”的值变成多行的?
apiVersion: v1
data:
Corefile: ".:53 {\n rewrite name regex (.*)\.test\.io {1}.default.svc.cluster.local \n errors\n health {\n lameduck 5s\n }\n ready\n kubernetes cluster.local in-addr.arpa ip6.arpa {\n pods insecure\n fallthrough in-addr.arpa ip6.arpa\n ttl 30\n }\n prometheus :9153\n forward . /etc/resolv.conf {\n max_concurrent 1000\n }\n cache 30\n loop\n reload\n loadbalance\n}\n"
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-25T12:36:15Z"
name: coredns
namespace: kube-system
resourceVersion: "14874"
uid: dc352ab8-1e43-4663-8c6a-0d404f4bb4f3
我尝试了 yq -P
,但这并没有帮助
基本命令是这样的(e
新版本可以省略):
yq e '.data.Corefile style="literal"' test.yaml
但是这在您的情况下不起作用,因为 YAML 表示尾随白色space 被忽略,因此您不能将带有尾随白色space 的数据格式化为文字块标量。您数据的相关部分是:
default.svc.cluster.local \n
^
这个space好像不相关,所以你可以写额外的代码来删除它:
yq e '.data.Corefile |= sub("\s*(\n)", "") | .data.Corefile style="literal"' test.yaml
(有一个奇怪的错误,我不能直接用 "\n"
替换,因为出于某种原因,这会在数据中创建 "\n"
,所以我改用捕获的换行符。)
结果:
apiVersion: v1
data:
Corefile: |
.:53 {
rewrite name regex (.*)\.test\.io {1}.default.svc.cluster.local
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-25T12:36:15Z"
name: coredns
namespace: kube-system
resourceVersion: "14874"
uid: dc352ab8-1e43-4663-8c6a-0d404f4bb4f3
我有一个像这样的 yaml。
有没有办法让“Corefile”的值变成多行的?
apiVersion: v1
data:
Corefile: ".:53 {\n rewrite name regex (.*)\.test\.io {1}.default.svc.cluster.local \n errors\n health {\n lameduck 5s\n }\n ready\n kubernetes cluster.local in-addr.arpa ip6.arpa {\n pods insecure\n fallthrough in-addr.arpa ip6.arpa\n ttl 30\n }\n prometheus :9153\n forward . /etc/resolv.conf {\n max_concurrent 1000\n }\n cache 30\n loop\n reload\n loadbalance\n}\n"
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-25T12:36:15Z"
name: coredns
namespace: kube-system
resourceVersion: "14874"
uid: dc352ab8-1e43-4663-8c6a-0d404f4bb4f3
我尝试了 yq -P
,但这并没有帮助
基本命令是这样的(e
新版本可以省略):
yq e '.data.Corefile style="literal"' test.yaml
但是这在您的情况下不起作用,因为 YAML 表示尾随白色space 被忽略,因此您不能将带有尾随白色space 的数据格式化为文字块标量。您数据的相关部分是:
default.svc.cluster.local \n
^
这个space好像不相关,所以你可以写额外的代码来删除它:
yq e '.data.Corefile |= sub("\s*(\n)", "") | .data.Corefile style="literal"' test.yaml
(有一个奇怪的错误,我不能直接用 "\n"
替换,因为出于某种原因,这会在数据中创建 "\n"
,所以我改用捕获的换行符。)
结果:
apiVersion: v1
data:
Corefile: |
.:53 {
rewrite name regex (.*)\.test\.io {1}.default.svc.cluster.local
errors
health {
lameduck 5s
}
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods insecure
fallthrough in-addr.arpa ip6.arpa
ttl 30
}
prometheus :9153
forward . /etc/resolv.conf {
max_concurrent 1000
}
cache 30
loop
reload
loadbalance
}
kind: ConfigMap
metadata:
creationTimestamp: "2022-02-25T12:36:15Z"
name: coredns
namespace: kube-system
resourceVersion: "14874"
uid: dc352ab8-1e43-4663-8c6a-0d404f4bb4f3