You need to enable JavaScript to run this app. Bash内嵌Python实现JSON转YAML时输出含字面\n而非换行的问题
优惠活动
大模型
产品
解决方案
定价
更多

Bash内嵌Python实现JSON转YAML时输出含字面\n而非换行的问题

异常根因
  • 无引号heredoc触发Bash转义篡改代码:你使用<< EOF(无引号heredoc)包裹Python代码时,Bash会自动对heredoc内容做转义处理。你原本在Python中写的value.replace('\\n','\n')(本意是匹配字面的\n字符,替换为真实换行),会被Bash将连续两个反斜杠转义为单个反斜杠,最终Python实际执行的代码变为value.replace('\n','\n')——这行代码的作用是将字符串内的真实换行符替换为真实换行符,完全无法处理字面\n字符。
  • 输入内容不匹配替换逻辑:你的JSON文件中列表类字段以转义字符串形式存储,经json.load解析后,字段值实际是字面的\+n两个独立字符,没有真实换行,和被Bash篡改后的Python替换逻辑完全错位,因此替换操作全程不生效。
解决方法
  • 锁定heredoc内容不转义:将heredoc的结束标记加上单引号,即把<< EOF改为<< 'EOF',让Bash完全保留heredoc内的Python代码原始内容,不做任何转义、变量替换。
  • 优化后的可直接运行脚本:
#!/bin/bash
# 替换为实际的安装目录路径
INSTALL_DIR=/opt/storm
# 将处理结果重定向写入目标YAML文件
python - ${INSTALL_DIR}/storm-tmp.json > ${INSTALL_DIR}/storm.yaml << 'EOF'
import sys
import json

with open(sys.argv[1], 'r') as f:
  obj = json.load(f)
for key in obj:
  value = obj[key]
  # 匹配字面\+n字符,替换为真实换行符
  value = value.replace('\\n','\n')
  print(f"{key}: {value}")
EOF
  • 效果验证:处理后的YAML文件会完全符合预期结构,列表项正确换行缩进,无字面\n字符残留。若需要调整列表项的缩进量,可在replace逻辑中匹配对应字符串,比如将'\n -'替换为'\n -'实现两个空格缩进。

内容的提问来源于stack exchange,提问作者yoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.30 23:36:08