Кажется, что в "diff" аромате regex не хватает? - PullRequest
11 голосов
/ 15 января 2010

У меня есть два файла, которые я пытался сравнить с diff. Файлы создаются автоматически и содержат ряд строк, которые выглядят следующим образом:

//!   Generated Date  : Mon, 14, Dec 2009

Мне бы хотелось, чтобы эти различия были проигнорированы, и я решил использовать для этого флаг "-I REGEX".

Однако число пробелов между «Date» и двоеточием варьируется, и, к сожалению, похоже, что в регулярных выражениях, используемых diff, отсутствует ряд основных утилит регулярных выражений.

Например, я не могу на всю жизнь заставить работать «один или несколько» плюсов. То же самое относится и к представлению пробела "\ s".

diff -I '.*Generated Date\s+:.*' ....

и

diff -I '.*Generated Date +:.*' ....

оба впечатляюще терпят неудачу.

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

Спасибо!

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

Благодаря FalseVinylShrub я установил, что должен экранировать мой '+' и любые подобные символы. Это несколько решает проблему. Дифф успешно соответствует

.*Generated Date \+.*

и

.*Generated Date  *.*

(Обратите внимание, что между «Дата» и «*» есть два пробела.)

Однако, во-вторых, я пытаюсь добавить ':' к этому выражению, вот так:

.*Generated Date \+:.*

и

.*Generated Date \+\:.*

Обе версии не совпадают с рассматриваемой строкой и приводят к запуску diff значительно большего количества времени. Есть мысли?

Ответы [ 3 ]

10 голосов
/ 15 января 2010

Очень интересно ... Я не смог найти справочную документацию, но небольшой эксперимент обнаружил, что:

  • ␠* и .* работали, если ноль или больше в порядке для вас
  • Как вы сказали, ␠+ не работает. ␠{1,} ... но ␠\{1,\} не работал
  • ОБНОВЛЕНИЕ: ␠\+ также работает!

( представляет символ пробела, который не появился).

Я использую GNU diff из GNU diffutils 2.8.1.

man diff и info diff не объяснили синтаксис RE.

Надеюсь, это поможет.

ОБНОВЛЕНИЕ: я нашел краткий раздел в man grep:

Базовые и расширенные регулярные выражения

В основных регулярных выражениях метасимволы?, +, {, |, (, И) потерять свое особое значение; вместо этого используйте версии с обратной косой чертой \ ?, \ +, \ {, \ |, \ (и \).

Так что я предполагаю, что он использует синтаксис Basic regex.

6 голосов
/ 15 января 2010

Хорошо, вот что говорит источник различий в GNU.

re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);

Я думаю, что это означает "то же, что и gnu grep -G" (основное регулярное выражение) Согласно странице руководства GNU grep:

В основных регулярных выражениях метасимволы?, +, {, |, (, а также ) потерять свое особое значение; вместо этого используйте версии с обратной косой чертой \ ?, \ +, \ {, \ |, \ (и \).

Забудьте о \ s, \ S и т. Д.

0 голосов
/ 15 января 2010

Согласно спецификации , diff не поддерживает регулярные выражения и не имеет переключателя -I.

Вы, кажется, используете нестандартный diff с нестандартными расширениями. Как работают эти нестандартные расширения, должно быть описано в документации к любому нестандартному diff, который вы используете.

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