У меня есть два файла конфигурации, оригинальный от менеджера пакетов и один измененный мной. Я добавил несколько комментариев для описания поведения.
Как мне запустить diff
файлы конфигурации, пропуская комментарии? Комментируемая строка определяется как:
- необязательный начальный пробел (табуляции и пробелы)
- знак хеша (
#
) - ничего другого персонажа
(Простейший) регулярное выражение пропуская первое требование будет #.*
. Я попробовал --ignore-matching-lines=RE
( -I RE
) вариант GNU diff 3.0, но не смог заставить его работать с этим RE. Я тоже пытался .*#.*
и .*\#.*
без удачи. Буквальное размещение строки ( Port 631
) as RE
ничего не соответствует и не помогает помещать RE между косыми чертами.
Как предполагается в инструменте «diff», аромат регулярных выражений кажется недостаточным? Я попробовал grep -G
:
grep -G '#.*' file
Кажется, это соответствует комментариям, но не работает diff -I '#.*' file1 file2
.
Итак, как использовать эту опцию? Как я могу заставить diff
пропустить определенные строки (в моем случае, комментарии)? Пожалуйста, не предлагайте grep
файл и сравнивать временные файлы.
источник
-I
опция заставляет блок игнорироваться, только если все его строки соответствуют регулярному выражению. Таким образом, вы можете игнорировать изменения только для комментариев таким образом, но не изменения комментариев, которые близки к изменениям без комментариев.diff -I
не ведет себя так, как я ожидал. Я обновил свой ответ примером, который прояснил мне это поведение.Ответы:
По словам Жиля,
-I
опция игнорирует только строку, если внутри этого набора ничего не найдено, кроме совпадения-I
. Я не получил его полностью, пока не проверил.Тест
В моем тесте участвуют три файла:
Файл
test1
:Файл
test2
:Файл
test3
:Команды:
Альтернативный способ
Поскольку пока нет ответа, объясняющего, как правильно использовать эту
-I
опцию, я предоставлю альтернативу, которая работает в оболочке bash:diff -u
- унифицированный дифференциал-B
- игнорировать пустые строки<(command)
- функция bash, называемая подстановкой процесса, которая открывает дескриптор файла для команды, что устраняет необходимость во временном файлеgrep
- команда для печати строк (не) соответствующих шаблону-v
- показать несовпадающие строкиE
- использовать расширенные регулярные выражения'^\s*(#|$)'
- регулярное выражение, соответствующее комментариям и пустым строкам^
- сопоставить начало строки\s*
- сопоставлять пробелы (табуляции и пробелы), если таковые имеются(#|$)
соответствует хеш-метке или, альтернативно, концу строкиисточник
Пытаться:
Обратите внимание, что регулярное выражение должно соответствовать соответствующей строке в обоих файлах, и оно соответствует каждой измененной строке в блоке, чтобы работать, иначе это все равно покажет разницу.
Используйте одинарные кавычки, чтобы защитить шаблон от расширения оболочки и экранировать символы, зарезервированные для регулярных выражений (например, скобки).
Мы можем прочитать в
diffutils
руководстве:Это поведение также хорошо объясняется Армель здесь .
Связанный: Как я могу выполнить diff, который игнорирует все комментарии?
источник
После поиска по сети, альтернативный способ Лекенштейна - лучший, который я нашел.
Но я хочу использовать вывод diff как патч ... и есть проблема, потому что номер строки записывается из-за "grep -v".
Поэтому я намерен улучшить эту командную строку:
Это не идеально, но номер строки хранится в файле патча.
Однако, если вместо строки комментария будет добавлена новая строка ... комментарий будет производить Hunk FAILED при исправлении, как мы видим ниже.
проверить сейчас нашу команду
/ dev / fd / 62 & / dev / fd / 63 - это файл, созданный путем подстановки процесса. Строка между "+ новая строка" и "-other text" является символом пробела по умолчанию, определенным в нашем выражении sed для замены комментариев.
А теперь, что будет, когда мы применим этот патч:
Решение состоит в том, чтобы не использовать унифицированный формат diff без -u
теперь рабочий файл патча (без гарантии результата в очень сложном процессе сравнения).
источник
diff -U0 one two
чтобы отключить контекст. Для исправления есть множество инструментов, которые могут быть лучше подходят, такие как kdiff3.-U0
возможность отключить контекст. Примечание: kdiff3 - это графический инструмент. Мне нужен автоматический инструмент для управления атрибутами git merge.vimdiff
поддерживает трехстороннее слияние, возможно, стоит посмотреть.Я обычно игнорирую этот беспорядок:
grep -v "^#" | cat -s
и различий тех или ...vim -d
чтобы посмотреть на файлы. Подсветка синтаксиса позволяет сделать различия между комментариями и комментариями, не являющимися комментариями, совершенно очевидными. Подсветка diff различий в строке, чтобы вы могли сразу увидеть, какие значения или части значений были изменены, делает это моим любимым.источник
Вот что я использую, чтобы удалить все закомментированные строки, даже те, которые начинаются с табуляции или пробела, и пустые:
или вы можете сделать
источник