Diff 2 arquivos ignorando strings entre @ e [

2

Estou comparando dois arquivos. Eu estou tentando ignorar os caracteres alfanuméricos após @ e antes de [ . Uma linha parece com

model.Field@d6b0d6b[fieldName
    
por Pooja Upadhyaya 18.04.2013 / 17:30

3 respostas

2

Eu usaria substituições de processos aqui:

diff <(sed 's/@[^[]*/@/' old) <(sed 's/@[^[]*/@/' new)
    
por 18.04.2013 / 22:16
2

Suponho que você esteja usando o Bash .

se v="model.Field@d6b0d6b[fieldName" , você pode fazer o seguinte:

# Extract the right side of "$v"
r="${v#*[}"
# Extract the left side of "$v"
l="${v%@*}"

# Combine
new_v="$l@[$r"; new_v1="$l$r"

Você pode usar "$ new_v" ou "$ new_v1" depende se você quer o @ e o [ou não.

Como o Sr. Wijsman comentou, minha resposta não responde a pergunta. Correto, eu não prestei muita atenção ao título. Vamos consertar e quebrar o código acima com a seguinte função para imprimir os dados de um único arquivo conforme necessário

pf()
{
    while read -r line; do
        # This is a bit fancy but does the same thing as the code above.
        printf '%s\n' "${line%@*}${line#*[}"
    done < "$1"
}

Agora, podemos usar diff os dois arquivos usando o seguinte comando:

diff <(pf file1.txt) <(pf file2.txt)

Aqui está uma Exemplo de saída

rany$ cat file1.txt

model.Field1@__A__[fieldName
model.FieldIAMDIFFERENT@__B__[fieldName
model.Field1@__C__[fieldName

rany$ cat file2.txt

model.Field1@__C__[fieldName
model.Field1@__D__[fieldName
model.Field1@__E__[fieldName

rany$ diff <(pf file1.txt) <(pf file2.txt)

2c2
< model.FieldIAMDIFFERENTfieldName
---
> model.Field1fieldName
rany$

Como você pode ver, o fato de as linhas serem diferentes entre @ e [está sendo ignorado, e a única linha que é diferente entre os arquivos é esta:

model.FieldIAMDIFFERENTfieldName

Sinto muito por não prestar muita atenção ao seu título como parte da pergunta.

    
por 18.04.2013 / 17:48
1

Filtre os arquivos de dados - então execute diff -:

sed 's/\@.*\[/@[/' file1 > file1.filt
sed 's/\@.*\[/@[/' file2 > file2.filt
diff file1.filt file2.filt

Uma alternativa é usar diff tem uma opção -I. Todas as linhas que correspondem ao padrão são ignoradas na comparação de diferenças. Selecione um padrão que selecione as linhas que não devem ser comparadas. por exemplo,

diff -I 'dataexplorer.bigindex' file1 file2

    
por 18.04.2013 / 17:48

Tags