Я хотел бы различить два файла, так, чтобы конец строк и пробел были проигнорированы. А именно, я бы хотел, чтобы diff не обнаружил разницы между d1.txt и d2.txt:

$ cat d1.txt                                                                    
test1                                                                           

test2                                                                           

test3                                                                           

 test4                                                                          
$ cat d2.txt                                                                    
test1test2test3test4               

По какой-то причине

diff -d -w -a --strip-trailing-cr d1.txt d2.txt

не делает работу Любая помощь приветствуется.

2 ответа2

0

Вот сценарий оболочки, который, я думаю, сделает то, что вы хотите. Это не так круто, как в @ terdon's onininer, но показывает отличающиеся символы.

#!/bin/bash
f1=`mktemp`
f2=`mktemp`
result=`mktemp`

# Do the comparison letter-by-letter
cat "$1" | tr -d '[:space:]' > "$f1"
cat "$2" | tr -d '[:space:]' > "$f2"
cmp -l "$f1" "$f2" > "$result"
retval=$?

# Print the results as characters rather than octal values
if [ "$retval" -ne 0 ]; then
  while read -a vals; do
    echo -e "${vals[0]}" '\0'"${vals[1]}" '\0'"${vals[2]}"
  done < "$result"
fi

rm -f "$f1" "$f2" "$result"
exit $retval

Благодаря https://stackoverflow.com/a/14267178/2877364 и https://stackoverflow.com/a/4642213/2877364 !

0

diff сравнивает строки, смотрите man diff:

diff - compare files line by line

Игнорирование пробела означает, что foo bar будет соответствовать строке foobar если она находится на одной строке. Поскольку ваши шаблоны в d1.txt занимают несколько строк, файлы всегда будут отличаться. Я на самом деле не читал исходный код, но думаю, что diff работает примерно так:

for each line number X in file1;
    line1 = line X from file1
    line2= line X from file2
    If line1 is equal to line2 the do something
    else do something else

Первая строка вашего файла1 отличается от первой строки файла2, поэтому сообщается о разнице. Если вы действительно хотите проверить, что файлы содержат точно такие же непробельные символы, вы можете попробовать что-то вроде этого:

diff <(perl -ne 's/\s*//xg; print' d1.txt) <(perl -ne 's/\s*/g; print' d2.txt)

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