在shell脚本中,我正在从应用程序包中的Info.plist读取字符串,在此示例中是从Copyright键,而$ 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
命令。
现在输出是(例如)Copyright: Copyright \\U00a9 1995-2015, Apple Inc.\\nAll rights reserved.
显然版权符号\ U00a9已被转义,换行符也是如此,但我怎样才能解决这个问题,以便shell脚本实际打印出符合要求的字符串,即带有版权符号和换行符?< / p>
PS:最后我可能会删除换行符,但作为第一步,我想按照预期回应整个事情。
答案 0 :(得分:2)
我会使用plutil
代替defaults
。的:
plist="/Applications/TextEdit.app/Contents/Info.plist"
plutil -p - < "$plist"
将打印
... some lines deleted...
"DTSDKName" => "macosx10.12internal"
"DTXcode" => "0800"
"NSHumanReadableCopyright" => "Copyright © 1995-2016, Apple Inc.
All rights reserved."
"DTSDKBuild" => "16C7"
"CFBundleDevelopmentRegion" => "English"
... other delted lines ...
-p
表示人类可读格式 - 很难处理。因此,最好将plist
转换为json
,例如:
plutil -convert json -r -o - - < "$plist"
-r
表示转换为人类可读的JSON
,例如
{
"CFBundleName" : "TextEdit",
"DTSDKName" : "macosx10.12internal",
"DTXcode" : "0800",
"NSHumanReadableCopyright" : "Copyright © 1995-2016, Apple Inc.\nAll rights reserved.",
"DTSDKBuild" : "16C7",
"CFBundleDevelopmentRegion" : "English",
"CFBundleVersion" : "329",
现在,您可以轻松过滤掉NSHumanReadableCopyright
密钥,即使使用awk
,但使用某些真正的工具要好得多。
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}'
将输出
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"
并打印好......