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

时间:2017-03-17 15:22:14

标签: bash macos unicode plist defaults

在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:最后我可能会删除换行符,但作为第一步,我想按照预期回应整个事情。

1 个答案:

答案 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"

并打印好......