Ack или grep регулярное выражение, чтобы соответствовать двум линиям, которые почти одинаковы - PullRequest
4 голосов
/ 05 октября 2010

Я искал в нашем коде что-то похожее на:

#$foo="bar";
$foo="baz";

Проблемы:

  1. Я не знаю имя переменной
  2. Я не знаю, какая строка на самом деле закомментирована.
  3. Кажется, я действительно не могу правильно написать многострочное регулярное выражение.

MyПервоначальная попытка была ack /\$(.\*)=.\*$\$($1)=/

Я предпочитаю ack обычно для поиска кода, но я тоже не против использования grep.JWZ, вероятно, думает, что у меня сейчас более двух проблем.

Ответы [ 3 ]

8 голосов
/ 05 октября 2010

Ни grep, ни ack не будут обрабатывать более одной строки одновременно.

0 голосов
/ 05 октября 2010

Это может сработать:

^#?(\$\w+)\s*=.*[\r\n]+#?\1\s*=.*$

Пояснение:

^            start of line
#?           optional comment
(\$\w+)      $, followed by variable name, captured into backreference no. 1
\s*          optional whitespace
=            =
.*           any characters except newline
[\r\n]+      one or more newlines (\r thrown in for safety)
#?           optional comment
\1           same variable name as in the last line
\s*=.*       as above
$            end of line

Это не проверяет, что закомментирована ровно одна из строк (она также будет совпадать, если ни одна, или обе не совпадают) Если это проблема, дайте мне знать.

Я не знаю, можно ли сделать grep для соответствия нескольким строкам в одном регулярном выражении; любой инструмент, который вы используете, должен быть установлен в режим "^/$ match start / end of line" (вместо начала / конца строки).

0 голосов
/ 05 октября 2010

Я не совсем понимаю ваши правила сопоставления, но это регулярное выражение должно показывать направление:

^#\$(\w+)=.*?\$(\1)=

// [x] ^$ match at line breaks
// [x] Dot matches all

Обычно grep не поддерживает многострочное сопоставление.

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