Инструмент "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
, который вы используете.