Vergleichen Sie 2 Dateien, wobei Zeichenfolgen zwischen @ und [ ignoriert werden.

Vergleichen Sie 2 Dateien, wobei Zeichenfolgen zwischen @ und [ ignoriert werden.

Ich vergleiche zwei Dateien. Ich versuche, die alphanumerischen Zeichen nach @und vor zu ignorieren [. Eine Zeile sieht aus wie

model.Field@d6b0d6b[fieldName

Antwort1

ich würde ... benutzenProzesssubstitutionenHier:

diff <(sed 's/@[^[]*/@/' old) <(sed 's/@[^[]*/@/' new)

Antwort2

Ich nehme an, Sie sindmit Bash.

Wenn v="model.Field@d6b0d6b[fieldName"ja, können Sie Folgendes tun:

# 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"

Sie können„$neu_v“oder„$neu_v1“hängt davon ab, ob Sie @ und [ möchten oder nicht.


AlsHerr Wijsmankommentiert, meine Antwort beantwortet die Frage nicht. Richtig, ich habe dem Titel nicht viel Aufmerksamkeit geschenkt. Lassen Sie uns das beheben und den obigen Code mit der folgenden Funktion umschließen, um die Daten einer einzelnen Datei nach Bedarf auszudrucken

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"
}

Nun können wir diffdie beiden Dateien mit dem folgenden Befehl löschen:

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

Hier ist ein Beispielausgabe

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$

Wie Sie sehen, wird die Tatsache, dass die Zeilen zwischen @ und [ unterschiedlich sind, ignoriert und die einzige Zeile, die sich zwischen den Dateien unterscheidet, ist diese:

Modell.FieldIAMDIFFERENTFeldname

Es tut mir leid, dass ich Ihrem Titel als Teil der Frage nicht sorgfältig Beachtung geschenkt habe.

Antwort3

Filtern Sie die Datendateien und führen Sie dann einen Diff-Vorgang durch:

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

Alternativ kann diffdie Option -I verwendet werden. Alle Zeilen, die dem Muster entsprechen, werden beim Diff-Vergleich ignoriert. Wählen Sie ein Muster aus, das eindeutig die Zeilen auswählt, die nicht verglichen werden sollen. Beispiel:

diff -I 'dataexplorer.bigindex' file1 file2

verwandte Informationen