使用perl在bash中将yaml转换为json

问题描述 投票:0回答:2

我正在尝试使用perl将yaml-string转换为bash中的json(不幸的是,必须像这样),并且遇到了问题。当我将其写入临时文件并进行转换时,它可以工作,但是不幸的是,我没有足够的perl经验来将其更改为与bash变量一样工作。我需要这样做,因为我想经常转换许多文件,并且始终创建临时文件的速度缓慢/效率低下,在我看来,这也是一个安全问题。

这是用于临时文件的命令:

jsonfile=$(perl -MYAML::XS=LoadFile -MJSON::XS=encode_json -e 'for (@ARGV) { for (LoadFile($_)) { print encode_json($_),"\n" } }' ${tempfile} )

我可以通过某种方式将此更改为某些内容吗?

jsonfile=$(echo "${yaml_string}" | perl .....)

我稍微改变了参数并尝试了类似的方法,但是输出却大不相同,无法使用:

jsonfile=$(echo "${yaml_string}" | perl -MYAML::XS=Load -MJSON::XS=encode_json -e 'for (<>) { for (Load($_)) { print encode_json($_),"\n" } }')

对此提供的任何帮助将不胜感激。

json bash perl yaml data-conversion
2个回答
1
投票

如果您使用bash作为外壳,则可以将yaml变量的内容作为herestring

perl -MYAML::XS -MJSON::XS -0777 -E 'say encode_json(Load(<>))' <<<"${yaml_string}"

-0777 switch是perl约定,告诉<> / getline将其所有输入读取为单个值,而不是一次读取一行。


0
投票

使用STDIN:

# bash
perl -MYAML::XS -MJSON::XS -0777e'CORE::say encode_json(Load(<>))' <( printf '%s' "$yaml_string" )

# bash
perl -MYAML::XS -MJSON::XS -0777e'CORE::say encode_json(Load(<>))' <<<"$yaml_string"

使用环境变量:

# sh, bash
export yaml_string
perl -MYAML::XS -MJSON::XS -e'CORE::say encode_json(Load($ENV{yaml_string}))'

# sh, bash
yaml_string="$yaml_string" perl -MYAML::XS -MJSON::XS -e'CORE::say encode_json(Load($ENV{yaml_string}))'

使用arg:

# sh, bash
perl -MYAML::XS -MJSON::XS -e'CORE::say encode_json(Load($ARGV[0]))' -- "$yaml_string"
© www.soinside.com 2019 - 2024. All rights reserved.