首页 > 解决方案 > 将诸如 \t 和 \n 之类的格式字符添加到 JSON 字符串中,以便它们可以在 linux echo 命令中工作

问题描述

我有一个到 linux 机器的开放 ssh 连接。我正在创建一个临时文件,需要使用 echo 命令将格式化的 Json 写入其中。无论如何我可以在必要的地方轻松添加 \t 和 \n 以便最终在临时文件中格式化为 json 吗?在我求助于创建一个解析它并手动添加 \t 和 \n 的函数之前。

jsonData := "{\"data\":[{\"id\": \"1000\", \"name\":\"Product 1\"}, {\"id\": \"2000\", \"name\":\"Product 2\"}, {\"id\": \"3000\", \"name\":\"Product 3\"}]}"

// Create a temp file
session1, err := conn.NewSession()
if err != nil {
    panic("Failed to create session: " + err.Error())
}
defer session1.Close()

var tmpFileName bytes.Buffer
session1.Stdout = &tmpFileName
if err := session1.Run("mktemp"); err != nil {
    panic("Failed to run: " + err.Error())
}

// Write json to temp file
session2, err := conn.NewSession()
if err != nil {
    panic("Failed to create session: " + err.Error())
}
defer session2.Close()

if err := session2.Run("echo " + jsonData + ">> " + tmpFileName.String()); err != nil {
    panic("Failed to run: " + err.Error())
}

标签: linuxgo

解决方案


您可以使用json.MarshalIndent

out, err := json.MarshalIndent(json.RawMessage(jsonData), "", "    ")
if err != nil {
    panic(err)
}

cmd := exec.Command("echo", string(out))
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
    panic(err)
}

https://play.golang.org/p/J4Z5txNOmgP


根据session2.Run实现方式,您可能需要转义并明确引用格式化的 json 字符串。

// this is a naive single quote bash-specific escape, if this isn't
// sufficient for your use case you'll have to improve on it.
jsonData = strings.ReplaceAll(string(out), "'", `'"'"'`)
cmd := fmt.Sprintf("echo '%s' >> %s", jsonData, tmpFileName)
if err := session2.Run(cmd); err != nil {
    panic(err)
}

推荐阅读