2017-03-17 13 views
1

셸 스크립트에서 응용 프로그램 번들의 Info.plist에서 문자열을 읽습니다. 예를 들어, $ FILEPATH가 애플리케이션 번들, 예. /Applications/TextEdit.app쉘 스크립트 (macOS) : 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 명령을 계속해서 사용할 필요가 없습니다. 줄 바꿈이었다로

이제 출력, 저작권 기호 \의 U00a9 이스케이프 된 분명히

Copyright: Copyright \\U00a9 1995-2015, Apple Inc.\\nAll rights reserved. (예를 들어)이지만, 쉘 스크립트가 실제로 문자열을 출력하도록 어떻게이 문제를 해결할 수 저작권 기호와 줄 바꿈이있는 것입니다.

추신 : 끝 부분에서 줄 바꿈을 제거 하겠지만 첫 단계로 모든 것을 의도 한대로 반향시키고 싶습니다.

답변

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사람이 읽을 수있는 형식으로을 의미 - 열심히 방법에 관한 것이다. 따라서, 더 나은 변환입니다 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", 

지금 당신은 쉽게도 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");' 저작권'$ (echo "$ jplist"|/usr/bin/perl -0777 - CSDA -MJSON :: PP -MEncode -E '$ p = decode_json (encode_utf8 (<>)); $ p -> {NSHumanReadableCopyright}'); 큰 문제는 plutil + perl 자체만으로도 충분히 빠르다는 것입니다.) – JayB

+0

@JayB 편집을 참조하십시오. 나를 위해 작동합니다. 괜찮습니다. – jm666