Как выполнить поиск в нескольких строках и заменить эти кратные строки на место?

#regex

#регулярное выражение

Вопрос:

В настоящее время у меня есть текстовые файлы, некоторая часть этих файлов похожа:

 #:some comment
msgid ""
"CCCCC"
msgstr ""

#: some comment
msgid ""
"CCCCC"
"DDDDD"
msgstr ""

#:some comment
msgid ""
"CCCCC"
"DDDDD"
"EEEEE"
msgstr ""
  

И у меня есть регулярное msgid ""(([^n#])*(n )) msgstr "" выражение, соответствующее всем этим строкам, кроме комментария.

Моя конечная цель — найти любые строки в msgid или после него и заменить их на msgstr

Нравится:

 #:some comment
msgid ""
"CCCCC"
msgstr ""
"CCCCC"

#: some comment
msgid ""
"CCCCC"
"DDDDD"
msgstr ""
"CCCCC"
"DDDDD"

#:some comment
msgid ""
"CCCCC"
"DDDDD"
"EEEEE"
msgstr ""
"CCCCC"
"DDDDD"
"EEEEE"
  

Поэтому, когда вы используете поиск и замену в регулярном выражении, $ 1 соответствует только последней строке каждой группы. Я надеялся, что $ 1 может соответствовать строкам между msgid и msgstr, чтобы его можно было заменить после msgstr.

Любое предложение будет очень полезно!

Комментарии:

1. попробуйте добавить все строки в одну строку (в случае java) и сопоставить регулярное выражение, чтобы извлечь все совпадения в этой строке.

2. Какое регулярное выражение вы используете? В чем вы их используете (perl, sed, awk, javascript)? Хотите добавить несколько соответствующих тегов?

Ответ №1:

Вот демонстратор sed sed -En ":a;N;$!ba;s/msgid ""((([^n#])*(n )) )msgstr ""/--1--/g;l" . Не зная больше о вашей среде, я выбрал это для тестирования.
Вам не нужен sed, это просто для того, чтобы показать, что и как я тестировал.

  • он должен избегать "
  • хитрость заключается в том, чтобы добавить еще одну группу захвата, которая включает текущую (...) ,
    которая из-за позиции все еще 1
  • демонстратор заключает совпадающую строку в «—«, чтобы показать, что было сопоставлено, это то, что, как я понимаю, вы хотите
  • комментарии все еще существуют, потому что они НЕ совпадают
  • msgid и msgstr ОТСУТСТВУЮТ в выходных данных, потому что они совпадают, как и ваше регулярное выражение

Для данного образца входных данных он выдает выходные данные:

 #:some comment
--
"CCCCC"
--

#: some comment
--
"CCCCC"
"DDDDD"
--

#:some comment
--
"CCCCC"
"DDDDD"
"EEEEE"
--
  

Регулярное выражение в вашем вкусе было бы (я думаю)
msgid ""((([^n#])*(n )) )msgstr ""

Дайте мне знать, какой язык / инструмент / вкус вы используете, и покажите мне свой код (а не только регулярное выражение), и я адаптирую ответ, чтобы он более точно соответствовал вашим потребностям.
Вы сказали, что хотите сопоставить текст между msgid и msgstr. Я прочитал, что включить "" сообщение с сообщением * НЕ с соответствующим текстом. Это не соответствует желаемому результату.
Если желаемый результат важнее описания, я также могу изменить его, но мне нужен ваш код в дополнение к вашему регулярному выражению.