@와 [ 사이의 문자열을 무시하는 Diff 2 파일

@와 [ 사이의 문자열을 무시하는 Diff 2 파일

두 파일을 비교하고 있습니다. @앞뒤 의 영숫자를 무시하려고 합니다 [. 라인은 다음과 같습니다

model.Field@d6b0d6b[fieldName

답변1

나는 사용할 것이다프로세스 대체여기:

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

답변2

나는 당신이 가정배쉬 사용.

그렇다면 v="model.Field@d6b0d6b[fieldName"다음을 수행할 수 있습니다.

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

당신이 사용할 수있는"$new_v"또는"$new_v1"@ 및 [를 원하는지 여부에 따라 다릅니다.


처럼위즈만 씨댓글을 달았지만 내 답변이 질문에 대한 답변이 아닙니다. 맞습니다. 제목에 별로 관심을 두지 않았습니다. 문제를 수정하고 위의 코드를 다음 함수로 래핑하여 필요에 따라 단일 파일의 데이터를 인쇄해 보겠습니다.

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

이제 diff다음 명령을 사용하여 두 파일을 만들 수 있습니다.

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

여기에는 샘플 출력

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$

보시다시피, @와 [ 사이의 행이 다르다는 사실은 무시되고 있으며, 파일 간에 다른 유일한 행은 다음과 같습니다.

모델.필드IAMDIFFERENT필드이름

질문 내용 중 제목을 세심히 살펴보지 못한 점 죄송합니다.

답변3

데이터 파일을 필터링한 다음 diff를 수행합니다.

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

대안은 diff-I 옵션을 사용하는 것입니다. 패턴과 일치하는 모든 행은 diff 비교에서 무시됩니다. 비교하지 않을 라인을 고유하게 선택하는 패턴을 선택하십시오. 예를 들어

diff -I 'dataexplorer.bigindex' file1 file2

관련 정보