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 включен в результаты? Как я могу это решить?

  • Поиск рекурсивно большого файла
  • Как определить, существует ли внешняя команда в сценарии?
  • Почему этот скрипт рыбы не запускается из пусковой установки?
  • find -exec не работает в скрипте bash, но работает в терминале
  • Как проверить, является ли данный путь файлом или каталогом
  • это скрипт, который запускается под текущей оболочкой или дочерней оболочкой?
  • Сценарий Awk работает только в том случае, если я редактирую текстовый файл вручную
  • Петля, чтобы проверить, установлен ли пакет Debian или нет.
  • 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 Игнорировать изменения, чьи строки пустые.

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