Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash shell脚本(macOS):打印plist字符串中转义的Unicode字符_Bash_Macos_Unicode_Plist_Defaults - Fatal编程技术网

Bash shell脚本(macOS):打印plist字符串中转义的Unicode字符

Bash shell脚本(macOS):打印plist字符串中转义的Unicode字符,bash,macos,unicode,plist,defaults,Bash,Macos,Unicode,Plist,Defaults,在shell脚本中,我从应用程序捆绑包中的Info.plist读取字符串,在本例中是从版权密钥读取字符串,而$FILEPATH是应用程序捆绑包的路径,例如/Applications/TextEdit.app #!/bin/bash PLIST=$(/usr/bin/defaults read "$FILEPATH/Contents/Info.plist") COPYRIGHT=$(echo "$PLIST" | /usr/bin/awk -F" = " '/NSHumanReadableCo

在shell脚本中,我从应用程序捆绑包中的Info.plist读取字符串,在本例中是从版权密钥读取字符串,而$FILEPATH是应用程序捆绑包的路径,例如
/Applications/TextEdit.app

#!/bin/bash  
PLIST=$(/usr/bin/defaults read "$FILEPATH/Contents/Info.plist")
COPYRIGHT=$(echo "$PLIST" | /usr/bin/awk -F" = " '/NSHumanReadableCopyright/{print $2}' RS=';' | /usr/bin/sed 's/^"\(.*\)"$/\1/')
echo "Copyright: $COPYRIGHT"
注意:我不是直接读钥匙,当然这会更容易;它被读入变量PLIST,因此脚本以后也可以读取其他键,而不必反复使用
defaults
命令

现在输出为(例如)
版权所有:版权所有\\U00a9 1995-2015,苹果公司\\保留所有权利。

显然版权符号\U00a9和换行符都被转义了,但是我如何解决这个问题,使shell脚本能够按原意打印字符串,即使用版权符号和换行符


PS:最后,我可能会删除换行符,但作为第一步,我希望按照预期重复整个内容。

我希望使用
plutil
而不是
默认值。委员会:

plist="/Applications/TextEdit.app/Contents/Info.plist"
plutil -p - < "$plist"
-p
意味着人类可读的格式-很难处理。因此,最好将
plist
转换为
json
,例如:

plutil -convert json -r -o - - < "$plist"
现在,即使使用
awk
,您也可以轻松过滤掉
NSHumanReadableCopyright
键,但最好使用真正的工具

默认情况下,Mac安装了
perl
,还安装了
JSON::PP
模块。因此:

plist="/Applications/TextEdit.app/Contents/Info.plist"
plutil -convert json -r -o - - < "$plist" |\
/usr/bin/perl -0777 -CSDA -MJSON::PP -MEncode -E '$p=decode_json(encode_utf8(<>));say $p->{NSHumanReadableCopyright}'
编辑: 将整个测试作为注释中的一行:

plist="/Applications/TextEdit.app/Contents/Info.plist"; jplist=$(/usr/bin/plutil -convert json -r -o - "$plist"); copyright=$(echo "$jplist" | /usr/bin/perl -0777 -CSDA -MJSON::PP -MEncode -E '$p=decode_json(encode_utf8(<>));say $p->{NSHumanReadableCopyright}'); echo "$copyright"
plist=“/Applications/TextEdit.app/Contents/Info.plist”;jplist=$(/usr/bin/plutil-convert-json-r-o-“$plist”);版权=$(echo“$jplist”|/usr/bin/perl-0777-CSDA-MJSON::PP-MEncode-E'$p=decode_json(encode_utf8());比如$p->{NSHumanReadableCopyright});echo“$版权所有”

并打印OK…

我可能建议引用
“/Applications/TextEdit.app/Contents/Info.plist”
(以防在处理其他应用程序名称时可能会有空格,或者$plist变量不正确)。这很好用。非常感谢。但是,不起作用的是将JSON plutil输出放入一个变量(比如jplist),然后回显该变量并将其传送到perl命令
jplist=$(/usr/bin/plutil-convert-json-r-o-“$plist”)
copyright=$(echo“$jplist”|/usr/bin/perl-0777-CSDA-MJSON::PP-MEncode-E'$p=decode_json(encode_utf8());比如$p->{NSHumanReadableCopyright})
echo“$copyright”
(这没什么大不了的,因为plutil+perl本身似乎已经足够快了。)不,实际上我现在测试了它,用plutil+perl为每个键分别读取许多plist键,与一个默认的read+echo&awk相比,它非常慢。因此plutil+perl组合只适用于可能会对stdout造成问题的特定键。啊,没有刷新&请参阅编辑…现在将测试它。谢谢你。@JayB-你说的每把钥匙是什么意思?你在做别的事。
JSON
是标准化格式。我回答了关于版权的问题-如果你想做其他事情-问一个新问题。:)
plist="/Applications/TextEdit.app/Contents/Info.plist"
plutil -convert json -r -o - - < "$plist" |\
/usr/bin/perl -0777 -CSDA -MJSON::PP -MEncode -E '$p=decode_json(encode_utf8(<>));say $p->{NSHumanReadableCopyright}'
Copyright © 1995-2016, Apple Inc.
All rights reserved.
plist="/Applications/TextEdit.app/Contents/Info.plist"; jplist=$(/usr/bin/plutil -convert json -r -o - "$plist"); copyright=$(echo "$jplist" | /usr/bin/perl -0777 -CSDA -MJSON::PP -MEncode -E '$p=decode_json(encode_utf8(<>));say $p->{NSHumanReadableCopyright}'); echo "$copyright"