我正在尝试使用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" } }')
对此提供的任何帮助将不胜感激。
如果您使用bash
作为外壳,则可以将yaml变量的内容作为herestring:
perl -MYAML::XS -MJSON::XS -0777 -E 'say encode_json(Load(<>))' <<<"${yaml_string}"
-0777
switch是perl约定,告诉<>
/ getline
将其所有输入读取为单个值,而不是一次读取一行。
使用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"