У меня есть некоторые plist файлы на Mac OS X, который я хотел бы уменьшить. У них есть много из <dict>
с <key>
и значения. Один из этих ключей является миниатюрой, которая имеет a <data>
значение с base64 закодировало двоичный файл (я думаю). Я хотел бы удалить этот ключ и значение.
Я думал, что это могло, возможно, быть сделано sed, но я действительно не знаю, как использовать его, и кажется, что sed только продолжает работать линию за линией основание?
Так или иначе я надеялся, что кто-то мог выручить меня. В файле я хотел бы удалить все, что соответствует следующему шаблону или чему-то близко к этому:
<key>Thumbnail<\/key>[^<]*<\/data>
В файле это похоже на это:
// Other keys and values
<key>Thumbnail</key>
<data>
TU0AKgAAOEi25Pqx3/ip2fak0vOdzPCVxu2RweuPv+mLu+mIt+aGtuaEtOSB
...
dCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA=
</data>
// Other keys and values
Кто-либо знает, как я мог сделать это? Кроме того, если существуют какие-либо лучшие инструменты, которые я могу использовать в терминале, чтобы сделать это, я хотел бы знать об этом также :)
Существует две утилиты, доступные на командной строке, конкретно посвященной работе с предпочтительными файлами списка: defaults
(в /usr/bin
) и PlistBuddy
в (/usr/libexec
).
Все еще использование sed
:
sed
действительно позволяет нескольким удаление строки с помощью D
вместо d
флаг.
например. sed -e '/<key>Thumbnail<\/key>/, /<\/data>/D' < /PATH/TO/FILE.txt
удаляет все экземпляры ключевой Миниатюры, и она связала данные.
Используя defaults
:
defaults delete /PATH/TO/PLIST "Thumbnail"
. Не включайте .plist
расширение как часть пути. Кроме того, это будет только работать над корневыми объектами уровня в a .plist
, таким образом, если ключ Миниатюры будет в другом массиве или dict, то он не будет работать.
Используя PlistBuddy
:
/usr/libexec/PlistBuddy -c "Delete :Thumbnail" /PATH/TO/PLIST.plist
. Если ключ Миниатюры вкладывается, можно добавить путь перед ним, если Вы знаете это. например. PlistBuddy -c "Delete :User:Thumbnail"
если запись Миниатюры была в Пользовательском словаре.
используйте awk, не sed
$ cat file
asdkf
asdklf
// Other keys and values
<key>Thumbnail</key>
<data>
TU0AKgAAOEi25Pqx3/ip2fak0vOdzPCVxu2RweuPv+mLu+mIt+aGtuaEtOSB
...
dCBBcHBsZSBDb21wdXRlciwgSW5jLiwgMjAwNQAAAAA=
</data>
// Other keys and values
ksdf
$ awk 'BEGIN{RS="</data>"} /<key>/{ gsub("<key>.*</key>|<data>.*","") }1' file
asdkf
asdklf
// Other keys and values
// Other keys and values
ksdf
в заявлении говорится, использовать </data>
как разделитель записей, затем замените теги <key>
и <data>
ни с чем, когда <key>
найден в записи
XMLStarlet является потрясающим инструментом командной строки для управления XML. Основные проблемы с ним 1), это - очень сложный инструмент (так как это делает очень сложные работы), и 2) необходимо было бы, вероятно, создать его для OS X сами.
Могло бы быть возможно сделать это с sed, но это будет трудно. Perl мог сделать это более легко. Кишки сценария жемчуга были бы:
undef $/; # This allows reading in of all lines in one swoop
$contents = <>; # Read in contents of file (specified on command line)
$contents = s{<key>Thumbnail</key>.*?</data>}{}s;
print $contents;
Если бы у Вас было вышеупомянутое в сценарии жемчуга, названном change.plx, и у Вас были свои данные в файле, названном файлом ключей, то Вы могли согласовать тот файл путем выполнения:
$ perl change.plx keyfile > /tmp/$$ && cat /tmp/$$ > keyfile && rm /tmp/$$
Конечно, удостоверьтесь, что у Вас есть резервное копирование любого файла, к которому Вы делаете это. Возможно сделать всю эту работу над несколькими файлами с единственной одной программой жемчуга строки на командной строке как это:
$ perl -p0777i -e 's{<key>Thumbnail</key>.*?</data>}{}s;' file file file ...
Marnix