2017-03-17 18 views
1

シェルスクリプトでは、アプリケーションバンドルのInfo.plistから文字列を読み込みます。この例では、$ FILEPATHはパスですアプリケーションバンドル、例えば​​シェルスクリプト(macOS):plist文字列からエスケープされたUnicode文字を出力する

#!/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 \著作権の記号は、エスケープされたが、シェルスクリプトが実際として文字列を出力するようにどのように私はこの問題を解決することができる(例えば)でありますそれは、著作権表示と改行があることを意味しましたか?

PS:最後には改行が削除される可能性がありますが、最初のステップとして、意図したとおりにすべてをエコーし​​たいと思います。

答えて

2

defaultsの代わりにplutilを使用します。 : - 処理するために一生懸命

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人間が読める形式を意味します。

plutil -convert json -r -o - - < "$plist" 

-rは、例えば、人間が読めるJSON変換を意味する。したがって、例えば、jsonplistを変換する方がよいです

{ 
    "CFBundleName" : "TextEdit", 
    "DTSDKName" : "macosx10.12internal", 
    "DTXcode" : "0800", 
    "NSHumanReadableCopyright" : "Copyright © 1995-2016, Apple Inc.\nAll rights reserved.", 
    "DTSDKBuild" : "16C7", 
    "CFBundleDevelopmentRegion" : "English", 
    "CFBundleVersion" : "329", 

今すぐ簡単にさえawkを使用して、NSHumanReadableCopyrightキーをフィルタリングすることができますが、いくつか本当ツールを使用することがはるかに優れています。

Macは、デフォルトでperlJSON::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" 

とプリントOK ...

+0

I /Applications/TextEdit.app/Contents/Info.plist "を引用することを提案するかもしれません(ちょうど、他のアプリ名、または$ plist変数が存在しなかった場合)。 –

+0

それは素晴らしいです。ありがとうございました。しかし、うまくいけないことは、JSON plutilの出力を変数に入れて、jplistとし、それをエコーし​​てperlコマンドに渡すことです。 'jplist = $(/ usr/bin/plutil -convert json -r -o - " $ plist ");' '著作権= $(エコー" $ jplist "|/usr/bin/perl -0777 - CSDA -MJSON :: PP -MEncode -E '$ p = decode_json(encode_utf8(<>)); $ p - > {NSHumanReadableCopyright}'); 'echo" $ copyright "' 大量に処理するので、plutil + perlは十分に速いと思われます。) – JayB

+0

@JayB編集を参照してください。私にとっては大丈夫です。 – jm666

関連する問題