Пусть в Perl регулярное выражение совпадает с символом новой строки, за которым следует tab в macOS - PullRequest
0 голосов
/ 10 июня 2018

У меня есть две строки в файле macp .plist:

    <key>Disabled</key>
    <true/>

Я хочу заменить true на false, но только если предыдущая строка равна <key>Disabled</key>.

Я знаю, что 1-я строка заканчивается на \n и, используя Perl, я могу сопоставить / заменить ее на:

perl -pi -w -e 's/Disabled<\/key>\n/DISABLED<\/key>\n/g' file

Примечание: я не хочу менять Disabled на DISABLED, этопросто чтобы показать соответствие работает.

Я знаю, что 2-я строка начинается с \t, и я могу сопоставить / заменить ее на:

perl -pi -w -e 's/\t<true/\t<false/g' file

Однако объединение двух шаблонов нене соответствует или не заменяет что-либо:

perl -pi -w -e 's/Disabled<\/key>\n\t<true/Disabled<\/key>\n\t<false/g' file

Я думал, что может быть скрытый символ между \n в конце 1-й строки и \t в начале 2-й строки, но я 'мы пробовали это регулярное выражение в BBEdit, и оно отлично работает:

Disabled</key>\n\t<true

Любая помощь будет очень цениться.

1 Ответ

0 голосов
/ 11 июня 2018

Казалось бы, мое понимание Perl очень ограничено.

После некоторого дальнейшего изучения я теперь понимаю, что в коде, который я использовал, Perl читал файл построчно.Что мне нужно было сделать, так это дать Perl команду прочитать файл за один раз или поместить его другим способом, чтобы «прихлопнуть» файл.Использование -0 переводит Perl в режим файл slurp .

Мой оригинальный нерабочий код:

perl -pi -w -e 's/Disabled<\/key>\n\t<true/Disabled<\/key>\n\t<false/g' file

Мой исправленный рабочий код с использованием -0:

perl -0pi -w -e 's/Disabled<\/key>\n\t<true/Disabled<\/key>\n\t<false/g' file

Чтобы сделать еще один шаг вперед, я заменил \n\t в шаблоне совпадения на (\s*), чтобы соответствовать любому space, tab или newline символу ноль или более раз и \n\t в шаблоне замены с $1:

perl -0pi -w -e 's/Disabled<\/key>(\s*)<true/Disabled<\/key>$1<false/g' file

Это лучше подходит для сопоставления любого количества пробельных символов, которые появляются между 2 строками.

...