Инструмент "diff" для инструмента регулярного выражения кажется недостаточным?

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

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

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

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

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

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

и

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

оба эффекта эффектно выглядят.

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

Спасибо!

===== EDIT =======

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

.*Generated Date \+.*

и

.*Generated Date  *.*

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

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

.*Generated Date \+:.*

и

.*Generated Date \+\:.*

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

Ответ 1

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

  • ␠* и .* работают, если нуль или более подходит для вас
  • Как вы сказали, ␠+ не работает. Также не было ␠{1,}... но ␠\{1,\} работало
  • UPDATE: ␠\+ также работает!

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

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

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

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

UPDATE: я нашел краткий раздел в man grep:

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

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

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

Ответ 2

Хорошо, вот что говорит источник GNU diff.

re_set_syntax (RE_SYNTAX_GREP | RE_NO_POSIX_BACKTRACKING);

Я думаю, что это означает, "то же, что и gnu grep -G" (Basic Regular Expression). Согласно странице gnu grep man:

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

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

Ответ 3

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

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