如何用yq将含换行的环境变量内容追加到YAML多行字符串?
问题描述
需要将包含换行的GROUPS环境变量内容追加至YAML文件的rbac.policy.csv多行字符串末尾,要求新增内容以独立行呈现。尝试过env()、strenv()及不同样式设置,要么破坏字符串格式,要么出现首行换行丢失的问题,新增内容与原最后一行粘连。
相关代码示例
- 环境变量定义:
GROUPS="\ng, ZI-LNX_1, role:metadata-viewer \ng, ZI-LNX_2, role:metadata-viewer \n" - 原YAML片段:
... rbac: policy.csv: |- p, role:metadata-viewer, repositories, get, */*, allow p, role:metadata-viewer, logs, get, */*, allow g, ZI-LNX__O_EA_0, role:metadata-viewer - 尝试过的yq命令:
yq -i 'rbac."policy.csv" += strenv(GROUPS) | ... style=""' file.yaml - 优化后仍有问题的命令:
groups="\ng, ZI-LNX_1, role:metadata-viewer \ng, ZI-LNX_2, role:metadata-viewer \n" export groups=$(cat <<EOF $(echo -e "$groups") EOF ) yq -i 'rbac."policy.csv" += (env(groups) | . style="literal")' file.yaml
可行解决方案
核心是处理环境变量的转义逻辑和yq对多行字符串的拼接规则,以下是几种可靠方案:
方案1:提前解析环境变量转义,再用strenv拼接
先在shell中解析环境变量的转义换行,确保换行符真实存在,再传递给yq:
# 解析转义字符并导出环境变量 export GROUPS=$(echo -e "\ng, ZI-LNX_1, role:metadata-viewer \ng, ZI-LNX_2, role:metadata-viewer \n") # 拼接后保持literal样式,避免格式错乱 yq -i 'rbac."policy.csv" = (rbac."policy.csv" + strenv(GROUPS)) | . style="literal"' file.yaml
方案2:手动添加分隔换行,避免内容粘连
去掉环境变量开头的\n,拼接时先追加一个换行再添加内容:
export GROUPS="g, ZI-LNX_1, role:metadata-viewer \ng, ZI-LNX_2, role:metadata-viewer" yq -i 'rbac."policy.csv" += "\n" + strenv(GROUPS) | . style="literal"' file.yaml
方案3:拆分-合并行,彻底解决格式问题
将原字符串和新增内容按行拆分后合并,再重新生成多行字符串,完全规避换行粘连:
export GROUPS="g, ZI-LNX_1, role:metadata-viewer\ng, ZI-LNX_2, role:metadata-viewer" yq -i 'rbac."policy.csv" = ( (rbac."policy.csv" | split("\n")) + (strenv(GROUPS) | split("\n")) ) | join("\n") | . style="literal"' file.yaml
内容的提问来源于stack exchange,提问作者MStikh
相关产品推荐
相关产品推荐

