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

  • Как безопасно вставить пароль пользователя в файл?
  • Считать файлы в дереве каталогов
  • Удалить старый файл с помощью сценария оболочки на FTP-сервере
  • Нельзя использовать псевдоним в скрипте, даже если я его определяю чуть выше!
  • Чтение .zshrc в X сеансе открыто? / Как выполнить скрипт в X сеансе открытия?
  • Найти последнюю строку файла для соответствия строки?
  • source / dev / stdin не работает должным образом
  • Какая цель переназначает переменную себе через эхо?
  • 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 - лучшая ОС в мире.