Sed: Удаление всего содержания, соответствующего шаблону

У меня есть некоторые 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

Кто-либо знает, как я мог сделать это? Кроме того, если существуют какие-либо лучшие инструменты, которые я могу использовать в терминале, чтобы сделать это, я хотел бы знать об этом также :)

1
задан 07.04.2010, 17:41

4 ответа

Существует две утилиты, доступные на командной строке, конкретно посвященной работе с предпочтительными файлами списка: 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" если запись Миниатюры была в Пользовательском словаре.

4
ответ дан 12.12.2019, 09:21

используйте 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> найден в записи

0
ответ дан 12.12.2019, 09:21

XMLStarlet является потрясающим инструментом командной строки для управления XML. Основные проблемы с ним 1), это - очень сложный инструмент (так как это делает очень сложные работы), и 2) необходимо было бы, вероятно, создать его для OS X сами.

0
ответ дан 12.12.2019, 09:21

Могло бы быть возможно сделать это с 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

0
ответ дан 12.12.2019, 09:21

Теги

Похожие вопросы