AIX diff -b не работает? - PullRequest
       12

AIX diff -b не работает?

2 голосов
/ 19 декабря 2011

Я пытаюсь сравнить файлы без учета возврата каретки - что diff -b на любом другом unix работает превосходно. Но на этой коробке AIX 5.3:

    tst1:tst2$ od -c testfile
0000000    t   h   i   s  \r  \n   f   i   l   e  \r  \n   h   a   s  \r
0000020   \n   c   a   r   r   i   a   g   e  \r  \n   r   e   t   u   r
0000040    n   s  \r  \n
0000044
tst1:tst2$ od -c testfile_nocr
0000000    t   h   i   s  \n   f   i   l   e  \n   h   a   s  \n   c   a
0000020    r   r   i   a   g   e  \n   r   e   t   u   r   n   s  \n
0000037
tst1:tst2$ diff -b testfile testfile_nocr
1,5c1,5
< this
< file
< has
< carriage
< returns
---
> this
> file
> has
> carriage
> returns
tst1:tst2$

Почему так?

1 Ответ

2 голосов
/ 19 декабря 2011

AIX 5.3 diff не считает \r пробелом. Смотрите следующую расшифровку:

/home/pax: od -c file1
0000000    h   e   l   l   o  \n   t   h   e   r   e  \n
0000014

/home/pax: od -c file2
0000000    h   e   l   l   o  \r  \n   t   h   e   r   e  \r \n
0000016

/home/pax: od -c file3
0000000    h   e   l   l   o      \n   t   h   e   r   e     \n
0000016

/home/pax: od -c file4
0000000    h   e   l   l   o  \t  \n   t   h   e   r   e  \t \n
0000016

/home/pax: diff -b file1 file2
1,2c1,2
< hello
< there
---
> hello
> there

/home/pax: diff -b file1 file3
<<No output>>

/home/pax: diff -b file1 file4
<<No output>>

Справочная страница для diff немного тупая по этому вопросу, заявляя, что -b "заставит любое количество пробелов в конце строки обрабатываться как один символ новой строки ...", но делает на самом деле не определяет то, что он считает пробелом.

Исходя из вышеприведенного стенограммы, я понял бы, что пробелы и табуляции в порядке, но возврат каретки - нет.

Одним из способов обойти это будет удаление каретки самостоятельно с помощью скрипта, подобного:

#!/usr/bin/ksh
# crdiff: diffs two files after changing \r\n to \n in both.
if [[ $# -ne 2 ]] ; then
    echo 'Usage: crdiff <file> <file2>'
    return 1
fi
perl -pne 's/\r$//' $1 >/tmp/xyzzy_$$_$1
perl -pne 's/\r$//' $2 >/tmp/xyzzy_$$_$2
diff -b /tmp/xyzzy_$$_$1 /tmp/xyzzy_$$_$2
rc=$?
rm -f /tmp/xyzzy_$$_$1 /tmp/xyzzy_$$_$2
return $rc

В качестве альтернативы, вы можете скомпилировать утилиту GNU diff на вашем устройстве и вставить ее в путь до /usr/bin - кажется, нет проблем с \r в качестве пробела. Фактически, мы делаем именно это на наших AIX4-боксах, поскольку diff даже не претендует на поддержку для поддержки опции -b.

...