2017-03-17 103 views
1

在一个shell脚本,我从应用包Info.plist中读取字符串,从版权键这个例子中,而$ filepath是路径一个应用程序包,例如​​shell脚本(MacOS的):打印转义Unicode字符从字符串的plist

#!/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脚本实际打印出来的字符串作为解决这个问题它的意思是,即版权标志和换行符?

PS:最后我可能会删除换行符,但作为第一步,我想呼应了整个事情的目的。

回答

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意味着人类可读的格式 - 这么难的过程。因此,更好的是转换plistjson,例如:

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" 

,并打印好......

+0

我可能暗示引述'“/Applications/TextEdit.app/Contents/Info.plist”'(以防万一与其他处理时,有可能是一个空间应用程序名称,或者$ plist变量没有碰巧是)。 –

+0

这很好。谢谢。然而,没有任何效果的是将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(<>)); say $ p - > {NSHumanReadableCopyright}');' 'echo'$ copyright“' (这不是这很重要,因为plutil + perl本身似乎足够快。) – JayB

+0

@JayB看到编辑 - 对我来说工作正常.. – jm666