首页 > 解决方案 > 为什么打印输出包含 '\n' 而不是断行?

问题描述

我正在获取 json 文件并将其转换为带有脚本的 yaml 文件。

我在 bash shell 脚本中使用了 python 代码,如下所示:

#!/bin/bash

#python - ${INSTALL_DIR}/storm-tmp.json > ${INSTALL_DIR}/storm.yaml << EOF
python - ${INSTALL_DIR}/storm-tmp.json << EOF
import os
import sys
import json

with open(sys.argv[1], 'r') as f:
  obj = json.load(f)
lines_to_write = []
for key in obj:
  value = obj[key]
  value = value.replace('\\n','\n')
  print(('%s: %s')%(key, value))
EOF

我希望输出类似于:

storm.log.dir: /logs
storm.zookeeper.servers: 
  - zkserver-0.zookeeper.com
  - zkserver-1.zookeeper.com
  - zkserver-2.zookeeper.com
storm.local.dir: /data
nimbus.seeds: 
  - stormnimbus-0.storm.com

但打印输出是:

storm.log.dir: /logs
storm.zookeeper.servers: \n - zkserver-0.zookeeper.com\n - zkserver-1.zookeeper.com\n - zkserver-2.zookeeper.com
storm.local.dir: /data
nimbus.seeds: \n - stormnimbus-0.storm.com

我不知道为什么这个\n字符没有被翻译成换行符。

我该如何解决这个问题?

已编辑

输入:

{
  "storm.log.dir" : "/logs",
  "nimbus.seeds" : "\\n - stormnimbus-0.storm.com",
  "storm.local.dir" : "/data",
  "storm.zookeeper.servers" : "\\n - zkserver-0.zookeeper.com\\n - zkserver-1.zookeeper.com\\n - zkserver-2.zookeeper.com"
}

标签: pythonbash

解决方案


在 bash 中做这种嵌套的反斜杠是很痛苦的。你需要:

  value = value.replace('\\\\n','\\n')

有了这个,你的脚本对我有用。

顺便说一句, 您可以替换它:

for key in obj:
  value = obj[key]

有了这个:

for key,value in obj.items():

推荐阅读