14

Из справочной страницы diff :

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

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

Из этого я делаю вывод, что разница между параметрами -b и -w должна заключаться в том, что -b чувствителен к типу пробелов (табуляции и пробелов). Тем не менее, это не так:

$ diff 1.txt 2.txt 
1,3c1,3
<     Four spaces, changed to one tab
<         Eight Spaces, changed to two tabs
<     Four spaces, changed to two spaces
---
>       Four spaces, changed to one tab
>               Eight Spaces, changed to two tabs
>   Four spaces, changed to two spaces
$ diff -b 1.txt 2.txt 
$ diff -w 1.txt 2.txt 
$

Итак, в чем разница между -b и -w ? Протестировано с diffutils 3.2 на Kubuntu Linux 13.04.

2 ответа2

15

Страница man не очень ясна по этому вопросу, но информационная страница содержит:

1.2 Подавление различий между пробелами и интервалами табуляции

Опция --ignore-tab-expansion (-E) игнорирует различие между вкладками и пробелами на входе. Вкладка считается равной количеству пробелов до следующей остановки табуляции (* note Tabs::).

Опция --ignore-trailing-space (-Z) игнорирует пробел в конце строки.

Опция --ignore-space-change (-b) сильнее, чем -E и -Z вместе взятые. Он игнорирует пробелы в конце строки и считает все другие последовательности одного или нескольких символов пробела в строке эквивалентными. С этой опцией diff считает следующие две строки эквивалентными, где $ обозначает конец строки:

 Here lyeth  muche rychnesse  in lytell space.   -- John Heywood$
 Here lyeth muche rychnesse in lytell space. -- John Heywood   $

Опция --ignore-all-space (-w) еще сильнее. Он игнорирует различия, даже если в одной строке есть пробел, а в другой нет ни одной. Символы "пробел" включают табуляцию, вертикальную табуляцию, подачу формы, возврат каретки и пробел; некоторые локали могут определять дополнительные символы как пробелы. С этой опцией diff считает следующие две строки эквивалентными, где $ обозначает конец строки, а ^M обозначает возврат каретки:

 Here lyeth  muche  rychnesse in lytell space.--  John Heywood$
   He relyeth much erychnes  seinly tells pace.  --John Heywood   ^M$

Для многих других программ символ новой строки также является пробелом, но diff - это программа, ориентированная на строки, а символ новой строки всегда заканчивается строкой. Следовательно, опция -w или --ignore-all-space не игнорирует изменения, связанные с новой строкой ; он игнорирует только другие изменения пробелов.

6

Похоже, это пробелы между словами, может быть, больше, но это мой результат:

diff 1.txt 2.txt 
1,2c1,2
< test
< next next
---
> te  st     
> next  next


diff -b 1.txt 2.txt 
1c1
< test
---
> te  st 

Результаты от -w ничего.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .