如何在多行中编写单行字符串?

时间:2018-12-14 03:37:06

标签: bash shell

我想通过curl发送带有长字符串字段的大json,如何将其裁剪为多行?例如:

curl -X POST 'localhost:3000/upload' \
  -H 'Content-Type: application/json'
  -d "{
    \"markdown\": \"# $TITLE\\n\\nsome content with multiple lines....\\n\\nsome content with multiple lines....\\n\\nsome content with multiple lines....\\n\\nsome content with multiple lines....\\n\\n\"
  }"

3 个答案:

答案 0 :(得分:2)

使用jq之类的工具来生成JSON,而不是尝试手动构造它。在shell中构建多行字符串,并让jq对其进行编码。最重要的是,这避免了TITLE包含可能在形成JSON值时需要正确转义的字符而引起的任何潜在错误。

my_str="# $TITLE
some content with multiple lines...
some content with multiple lines...
some content with multiple lines..."

my_json=$(jq --argjson v "$my_str" '{markdown: $v}')

curl -X POST 'localhost:3000/upload' \
  -H 'Content-Type: application/json' \
  -d "$my_json"

curl可以从标准输入中读取-d的数据,这意味着您可以将jq的输出直接传送到curl

jq --argjson v "$my_str" '{markdown: $v}' | curl ... -d@-

答案 1 :(得分:2)

通过使用\终止行,您可以使用帖子中已有的技术将任何内容拆分为多行。 如果您需要在带引号的字符串中间进行拆分, 终止报价并开始新的报价。 例如,这些是等效的:

echo "foobar"
echo "foo""bar"
echo "foo"\
     "bar"

但是对于您的特定示例,我建议一种更好的方法。 在双引号字符串中创建JSON容易出错, 由于必须转义所有内部双引号, 这也变得难以阅读和维护。 更好的选择是使用此处文档, 将其通过管道传递到curl,然后使用-d@-使其从stdin读取JSON。 像这样:

formatJson() {
    cat << EOF
{
  "markdown": "some content with $variable in it"
}
EOF
}

formatJson | curl -X POST 'localhost:3000/upload' \
  -H 'Content-Type: application/json'
  -d@-

答案 2 :(得分:1)

如果我是您,则将JSON保存到文件中:

curl -X POST 'localhost:3000/upload' \
    -H 'Content-Type: application/json' \
    -d "$(cat my_json.json)"