diff ignorando eol e espaço em branco

0

Eu gostaria de diferenciar dois arquivos, de modo que o fim das linhas e o espaço em branco sejam ignorados. Ou seja, gostaria que o diff não encontrasse diferença entre d1.txt e d2.txt:

$ cat d1.txt                                                                    
test1                                                                           

test2                                                                           

test3                                                                           

 test4                                                                          
$ cat d2.txt                                                                    
test1test2test3test4               

Por algum motivo,

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

não faz o trabalho. Qualquer ajuda é apreciada.

    
por ffcitatos 02.09.2013 / 17:50

2 respostas

0

diff compara linhas , consulte man diff :

diff - compare files line by line

Ignorar o espaço em branco significa que foo bar corresponderá a foobar se estiver na mesma linha . Como seus padrões em d1.txt abrangem várias linhas, os arquivos sempre serão diferentes. Na verdade, eu não li o código-fonte, mas acho que diff funciona como:

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

A primeira linha do seu arquivo1 não é igual à primeira linha do arquivo2, portanto, uma diferença é relatada. Se você realmente quiser verificar se os arquivos contêm exatamente os mesmos caracteres que não são espaços em branco, tente algo assim:

diff <(perl -ne 's/\s*//xg; print' d1.txt) <(perl -ne 's/\s*/g; print' d2.txt)
    
por 02.09.2013 / 18:11
0

Aqui está um script de shell que eu acho que vai fazer o que quiser. Não é tão legal quanto o oneliner de @ terdon, mas mostra caracteres diferentes.

#!/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]}" '
#!/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]}" '%pre%'"${vals[1]}" '%pre%'"${vals[2]}"
  done < "$result"
fi

rm -f "$f1" "$f2" "$result"
exit $retval
'"${vals[1]}" '%pre%'"${vals[2]}" done < "$result" fi rm -f "$f1" "$f2" "$result" exit $retval

Graças ao link e link !

    
por 12.06.2015 / 14:32

Tags