如何将json文件格式化为bash环境变量?

如何将json文件格式化为bash环境变量?,json,bash,shell,printf,xargs,Json,Bash,Shell,Printf,Xargs,我试图获取配置文件(JSON格式)的内容,去掉无关的新行和空格,使其简洁,然后在启动应用程序之前将其分配给环境变量 到目前为止,我已经做到了: pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 printf '%q\n'` npm run start 这会

我试图获取配置文件(JSON格式)的内容,去掉无关的新行和空格,使其简洁,然后在启动应用程序之前将其分配给环境变量

到目前为止,我已经做到了:

pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 printf '%q\n'` npm run start
这会将一个简短的node.js应用程序导入节点运行时,并获取一个文件名参数,然后对JSON文件进行解析和字符串化,以验证该文件并删除任何不必要的空白。到目前为止还不错

结果通过管道传输到printf,或者至少是这样,但是printf显然不支持这种方式的输入,所以我使用xargs以它支持的方式传递它

我正在使用%q格式化程序来格式化转义任何字符的字符串,这在命令中可能是一个问题,但当通过xargs调用printf时,printf声称它不支持%q。我认为这可能是因为printf有不止一个版本,但我不确定如何解决这个问题

任何帮助都将不胜感激,即使解决方案与我开始的完全不同:)谢谢

更新 以下是我在MacOS上获得的输出:

$ cat config.json | xargs -0 printf %q
printf: illegal format character q
我的JSON文件如下所示:

{
    "hue_host": "192.168.1.2",
    "hue_username": "myUsername",
    "port": 12000,
    "player_group_config": [
        {
            "name": "Family Room",
            "player_uuid": "ATVUID",
            "hue_group": "3",
            "on_events": ["media.play", "media.resume"],
            "off_events": ["media.stop", "media.pause"]
        },
        {
            "name": "Lounge",
            "player_uuid": "STVUID",
            "hue_group": "1",
            "on_events": ["media.play", "media.resume"],
            "off_events": ["media.stop", "media.pause"]
        }
    ]
}
两种方式:

  • 使用
    xargs
    拾取
    bash
    printf
    内置文件,而不是
    printf(1)
    可执行文件,可能位于
    /usr/bin/printf
    (感谢@GordonDavisson):

  • 更简单:如果引用命令,则不必转义命令的输出。与
    bash
    中的
    echo”“
    正常一样,这也应该起作用:

    pwr_config="$(echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json )" npm run start
    
    这使用了较新的
    $(…)
    形式,而不是
    `…`
    ,因此命令的结果是一个单词按原样存储在
    pwr\u config
    变量中*

  • 更简单的是:如果您的
    npm run start
    脚本关心JSON中的空白,那么它就从根本上被破坏了:)。只要做:

    pwr_config="$(< config.json)" npm run start
    
    pwr_config=“$(

    $(
    cat file.json | xargs-0 printf%q
    适用于我在debian9上的操作。在使用xargs命令之前,您可以提供更多信息和管道输出示例吗?发布您的json内容并向我们显示所需的确切输出。使用
    jq
    感谢您的帮助!编辑问题以包含所需的信息。所需的输出是JSON文件压缩到一个环境配置字符串中,作为我要运行以执行脚本的命令的一部分…
    foo=$(jq-c.config.JSON)
    xargs printf
    将运行/usr/bin/printf,而不是bash内置版本(因为
    printf
    不是由bash执行,而是由
    xargs
    执行),并且/usr/bin版本通常不支持
    %q
    格式。哇,非常感谢您的回答和大量的简化!太完美了:D
    pwr_config="$(< config.json)" npm run start