我正在尝试获取配置文件(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"]
}
]
}
答案 0 :(得分:1)
两种方式:
使用xargs
内置bash
的{{1}}而不是printf
可执行文件(可能是printf(1)
中的可执行文件)(感谢@GordonDavisson ):
/usr/bin/printf
更简单:如果引用命令,则不必转义命令的输出。与pwr_config=`echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json | xargs -0 bash -c 'printf "%q\n"'` npm run start
在echo "<|>"
中可以确定的方式相同,这也应该起作用:
bash
这将使用较新的pwr_config="$(echo "console.log(JSON.stringify(JSON.parse(require('fs').readFileSync(process.argv[2], 'utf-8'))));" | node - config.json )" npm run start
形式而不是$(...)
,因此命令的结果是将一个单词原样存储在`...`
变量中。 * < / sup>
更简单:如果您的pwr_config
脚本关心JSON中的空白,那么它就从根本上被破坏了:)。只要做:
npm run start
pwr_config="$(< config.json)" npm run start
返回$(<...)
的内容。它们都作为一个单词(config.json
)存储到""
,换行符和所有行中。 * 如果出现问题,则pwr_config
都出错,应该修复,或者您正在运行的代码有错误,需要修复。
*您实际上不需要config.json
周围的""
。例如$()
和foo=$(echo a b c)
具有相同的效果。但是,我想加入foo="$(echo a b c)"
来提醒自己,我是专门要求将所有文本都保留在一起。