Сопоставить многострочный шаблон в bash с помощью Perl в macOS - PullRequest
0 голосов
/ 14 декабря 2018

На macOS, используя встроенный bash, мне нужно сопоставить два слова в двух последовательных строках в файле, скажем myKey и myValue.

Файл примера:

<dict>
    <key>myKey</key>
    <string>myValue</string>
</dict>

У меня уже есть рабочая команда для замены значения в такой паре с использованием perl:

perl -i -p0e 's/(<key>myKey<\/key>\s*\n\s*<string>).+(<\/string>)/$1newValue$2/' -- "$filepath"

Вопрос в том, как мне просто найтифайл содержит эту пару ключ / значение, не подставляя ничего, или, более точно, просто узнайте, была ли произведена какая-либо замена?

РЕДАКТИРОВАТЬ:

  1. В шаблоне замены: \1 -> $1.
  2. Добавлено уточнение вопроса.

1 Ответ

0 голосов
/ 14 декабря 2018

Для базового вопроса вам нужно всего лишь заменить оператор подстановки на оператор сопоставления и вывести условно в зависимости от того, соответствует он или нет.Это также может быть сделано с подстановкой.

Однако, поскольку это в сценарии bash, вы также можете exit из программы perl (однострочная) с кодом, который указывает, было ли совпадение/ замещение;тогда скрипт может проверить $?.

, чтобы только проверить, находится ли шаблон в файле

perl -0777 -nE'say "yes" if /pattern/' -- "$file"

-0777, который "глотает" весь файл (в $_) безопаснее -0, в котором в качестве разделителя записей используется нулевой байт.Кроме того, здесь вы не хотите -i (изменить файл вместо ) и хотите -n (циклическое перезапись записей) вместо -p (также печатает каждый).Я использую -E вместо -e, чтобы включить (все) feature с, для say.См. Все это в perlrun .

Внутри сценария оболочки вы можете использовать возвращение истинного / ложного оператора поиска в exit

perl -0777 -nE'exit(/pattern/)' -- "$file"
# now check $? in shell

, где вы можетеТеперь программно проверьте, был ли шаблон найден в файле.

Наконец, чтобы запустить исходную подстановку и , можно проверить, были ли выполнены какие-либо

perl -i -0777 -pe'exit(s/pattern/replacement/)' -- "$file"
# now check $? in shell

, гдетеперь код выхода, то есть $? в оболочке, это число выполненных замен.

Имейте в виду, что это нарушает основную логику успеха / неудачи кодов возврата.

См. perlretut для учебника регулярных выражений.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...