Як я можу розрізнити 2 файли, ігноруючи пробіли


81

У мене є 2 вихідні файли, це різні версії одного і того ж. Однак один пройшов інший редактор, який вносив зміни відступу, тому всі рядки різняться різницею.

Чи існує команда diff або фільтр, за допомогою якого я можу використовувати diff, щоб на виході були лише рядки, які відрізняються після ігнорування пробілів / вкладок?

Відповіді:


111

diff має кілька варіантів, які можуть вам стати в нагоді:

   -E, --ignore-tab-expansion
          ignore changes due to tab expansion

   -Z, --ignore-trailing-space
          ignore white space at line end

   -b, --ignore-space-change
          ignore changes in the amount of white space

   -w, --ignore-all-space
          ignore all white space

   -B, --ignore-blank-lines
          ignore changes whose lines are all blank

Тому diff -w old newслід ігнорувати всі пробіли і, таким чином, повідомляти лише про істотно різні рядки.


14
Варто зазначити, що -wефективно видаляє весь пробіл з рядків перед порівнянням, тому abі a bвважаються однаковими. Я вважаю за краще , -bтому що вона ігнорує пробільні зміни , а це означає , що abі a bвважаються різними , але a bі a+ кілька прогалин + b(вибачте, міні-Markdown не дозволить кілька прогалин в коді!) Вважаються однаковими.
IpsRich,

Як я можу ігнорувати всі нові рядки?
StackOverflow Офіційний

3
Чи можу я сказати diffігнорувати еквівалентні розширення рядів для трансцендентних чисел, таких як e та pi?
генеорама

@RichardWiseman Хороший момент; у випадках, коли є безлад між різницями між вкладками та пробілами, немає жодної вдалої комбінації, яка працює, крім -w. -tb, -tbB, -tІ т.д. все витоку в певних розбіжностей , які ви хотіли б ігнорувати. -wні, навіть якщо це також може виключити деякі відмінності, які ви хотіли б бачити.
TurnipEntropy


0
diff -bB file[12]
-b, --ignore-space-change
      ignore changes in the amount of white space
-B, --ignore-blank-lines
      ignore changes whose lines are all blank

Зверніть увагу, що ця -wопція ігноруватиме всі пробіли перед різницею, тому рядок like this i s a lineта this is a lineу кожному файлі буде порівнюватися як thisisalineі не повідомляти про відмінності.

Окрім -wпроблеми з опціями, навіть у -bопції є незначні проблеми, і це не ігнорує пробіли, якщо вони виникають при проханні рядка

Отже, вам слід використати sedдля видалення тих пробілів, які виникли спочатку, а потім зробіть `diff -bB.

diff -bB <(sed 's/^[ \t]*//' file1) <(sed 's/^[ \t]*//' file2)

0

Мій інструмент Linux з відкритим кодом "dif" порівнює файли, ігноруючи різні відмінності, включаючи пробіли.

У ньому є безліч інших варіантів ігнорування коментарів або позначок часу, сортування вхідних файлів, пошуку / заміни, ігнорування певних рядків тощо.

Після попередньої обробки вхідних файлів він запускає інструменти Linux meld, gvimdiff, tkdiff або kompare на цих проміжних файлах.

Встановлення не потрібно, просто завантажте та запустіть виконуваний файл 'dif' з https://github.com/koknat/dif

Щоб ущільнити будь-який пробіл в одному просторі, використовуйте параметр -white:

dif file1 file2 -white

Щоб видалити весь пробіл (крім нових рядків), використовуйте параметр -nowhite:

dif file1 file2 -nowhite
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.