Diff не работает, как я ожидаю

У меня есть 2 файла, a.txt и b.txt и я хочу их сравнить.

a.txt содержит:

 abc jkl < jkl mno > mno pqr <> pqr 

b.txt содержит:

 abc jkl < jkl mno > mno pqr <> pqrs stu 

Я использую этот скрипт:

 $ diff a.txt b.txt | grep "> " | cut -c3- > c.txt 

Что приводит к c.txt :

 pqr <> pqr pqr <> pqrs stu 

Почему pqr <> pqr включен в результаты? Как я могу это решить?

  • Ошибка фиксации сигнала 13 (SIGPIPE) для поиска и grep-конвейера
  • Преобразование Bash to Fish: отображение пользовательского сообщения при записи CD в определенный каталог
  • одномерный массив в оболочке, не работающий для индексов больше 08
  • заменить столбец csv-файла на столбец из другого файла
  • Повторная команда с разными именами файлов
  • Трубы Bash vs ksh
  • Синтаксическая ошибка в точке с запятой в сценарии оболочки
  • Сценарий для поиска среды рабочего стола по умолчанию?
  • 3 Solutions collect form web for “Diff не работает, как я ожидаю”

    Как отметил @StephaneChazelas, вы забыли привязать свое регулярное выражение, поэтому "> " будет соответствовать > в строке pqr <> pqr которая находится только в a.txt .

    Но похоже, что вы хотите, чтобы фильтр показывал только новые, измененные в b.txt . Если вы используете GNU diff, он предлагает вам некоторые варианты для достижения этого напрямую:

     $ diff --old-line-format '' --unchanged-line-format '' --new-line-format '%L' a.txt b.txt pqr <> pqrs stu 

    Формат --old-line-format '' удаляет все строки, которые не находятся в b.txt , --unchanged-line-format '' удаляет все строки, общие для обоих файлов, и --new-line-format '%L' показывает только содержимое строки для всех новых или измененных строк в b.txt . Ведущий > подавляется.

    Как пояснил @StephaneChazelas в комментариях, это, казалось бы, не имеет ничего общего с SSH. Выполняя все локально, я получаю те же результаты, что и вы, в основном:

     $ diff a.txt b.txt | grep "> " | cut -c3- pqr <> pqr pqr <> pqrs stu 

    Команда diff определяет разные строки, а строка pqr <> pqrs является уникальной среди двух файлов. Вы можете использовать бок о бок diff, чтобы увидеть, какие линии выстраиваются в линию, если это помогает.

     $ diff -y a.txt b.txt abc abc jkl < jkl jkl < jkl mno > mno mno > mno pqr <> pqr | pqr <> pqrs > stu 

    Линии, похожие, но не идентичные, отмечены знаком | , Линии, которые уникальны, отмечены символом >, если только в файле # 2, или <, если только присутствуют в файле # 1. Идентичные линии не имеют такой маркировки.

    Возможно, у вас есть лишние пробелы.

    пытаться

     diff -w -B file1.txt file2.txt 

    -w Игнорировать все пробелы.

    -B Игнорировать изменения, чьи строки пустые.

    Interesting Posts

    Точка монтирования для общесистемного USB-диска

    Выполнение сценария Nmap для обнаружения сердечной недостаточности терпит неудачу

    Автоматическое изменение разрешения файла при записи в папку

    Как отображать зависимости, заданные в make-файле как дерево?

    Простой, но правильный способ иметь сценарий bash отправлять вывод в журнал systemd?

    Использование ssh с аутентификацией на основе сертификатов

    как проверить, работает ли ssh без подключения к серверу

    Каковы недостатки uClibc?

    Как подождать по программе, запущенной в другой оболочке

    Есть ли простой способ установки драйверов madwifi в Fedora 17?

    Почему Linux имеет компилятор C по умолчанию?

    По умолчанию оболочка не выбрана с помощью useradd

    Создание ярлыков / псевдонимов в Fedora

    Нужно ли указывать подстановки команд при назначении их вывода переменной?

    Получить текущий каталог скриптов (чтобы я мог включать файлы без относительных путей и запускать скрипт из разных источников)

    Linux и Unix - лучшая ОС в мире.