Grep для файла .PO или RegEx для блока текста между разделителями - PullRequest
0 голосов
/ 04 августа 2010

Начните с этого файла:

msgid "a string"
msgstr ""

msgid ""
"A longer string wraps "
"on multiple lines."
msgstr ""

Grep RegEx для замены всех msgstr строк следующим образом:

msgid "a string"
msgstr "{a string}"

msgid ""
"A longer string wraps "
"on multiple lines."
msgstr ""
"{A longer string wraps "
"on multiple lines.}"

В моей бесконечной наивности я бы искал

\bmsgid "\b(*)\b"
msgstr "\b

... заменить его на

msgid "\1"
msgstr "{\1}"

Но это никуда меня не приведет.После поиска в Интернете и попытки адаптировать различные решения для Java или C #, я сдался и решил спросить здесь.

Синтаксис файла, который вы видите выше, если для файлов переводов .PO.

Для этого я использую текстовый редактор TextWrangler в Mac OS, который поддерживает синтаксис Grep RegEx.

Спасибо.

1 Ответ

1 голос
/ 04 августа 2010

Там есть два разных паттерна.Первый шаблон msgid "a string", по-видимому, указывает, что суммарные данные, следующие за msgid, представляют собой шаблон из одной строки.Второй шаблон `` msgid "" `указывает, что данные следуют в несколько строк.

Поскольку это два разных шаблона, и вы будете связывать себя узлами, пытаясь сопоставить их всех в одном регулярном выражении.(Если вы не используете Perl или что-то с некоторой программной логикой в ​​дополнение к RegEx ...) Вы сказали, что хотите использовать Text Wrangler, поэтому я ограничу свои комментарии тем, что работает в этом.

Я думаю, что вам нужно будет сделать два цикла поиска / замены с двумя сохраненными шаблонами, чтобы сделать это легко в Text Wrangler (TW).В TW вы можете использовать флаг (?sm) в начале вашего паттерна, чтобы .* паттерны соответствовали окончанию линии.TW сохраняет предыдущие совпадения Grep, так что это довольно легко, когда вы получите два работающих шаблона поиска / замены.

Таким образом, шаблон из одной линии можно сопоставить с шаблоном msgid "([^"]*)", который у вас есть.Второй шаблон можно сопоставить в BB Edit или TW с (?sm)msgid ""[^"]*(.*)msgstr ""

Вы можете написать регулярное выражение с изменением и именованными захватами, чтобы соответствовать двум шаблонам и заменить за один раз, но это займет намного меньшевремя написать что-нибудь быстрое на Perl ...

...