代码之家  ›  专栏  ›  技术社区  ›  yoon

为什么打印输出包含'\n'而不是换行?

  •  0
  • yoon  · 技术社区  · 3 年前

    我正在获取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"
    }
    
    2 回复  |  直到 3 年前
        1
  •  3
  •   Tim Roberts    3 年前

    在bash中执行这种嵌套的反斜杠是很痛苦的。您需要:

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

    这样的话,你的剧本就适合我了。

    for key in obj:
      value = obj[key]
    

    for key,value in obj.items():
    
        2
  •  0
  •   Allan Wind    3 年前

    #!/bin/bash
    
    python - 1.json <<'EOF'
    import os
    import sys
    import json
    
    with open(sys.argv[1], 'r') as f:
      obj = json.load(f)
    for k, v in obj.items():
      print(('%s: %s') % (k, v.replace('\\n', '\n')))
    EOF