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
相关产品推荐
相关产品推荐

