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

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 Игнорировать изменения, чьи строки пустые.

  • как добавить строку в файл / etc / sudoers с помощью скрипта оболочки (50servers)?
  • подсчет нескольких шаблонов за один проход с помощью grep?
  • Как избежать повторения команд sed при добавлении сайтов в лак?
  • Неожиданный EOF при поиске соответствия `''
  • Почему «до» блок спроектирован, так как это всего лишь отрицательная версия `while`?
  • печать в awk
  • Синтаксическая ошибка Bash, когда «else» следует за пустой категорией «then»
  • Регистрация выходных команд на нескольких серверах ssh
  • Автоматический запуск определенных скриптов при первом входе в систему / при запуске ПК
  • Какова цель иметь две переменные ($ @, $ *) для передачи аргументов команды в скрипт?
  • Значение суммы рядом с определенным шаблоном
  • Отображать строку в текстовом файле, если переменная соответствует части в строке?
  • Linux и Unix - лучшая ОС в мире.