@ と [ の間の文字列を無視して 2 つのファイルを比較する

@ と [ の間の文字列を無視して 2 つのファイルを比較する

@2つのファイルを比較しています。前後の英数字を無視しようとしています[。行は次のようになります。

model.Field@d6b0d6b[fieldName

答え1

私は使うだろうプロセスの置換ここ:

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

答え2

あなたはそうだと思いますBashを使用する

その場合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次のコマンドを使用して 2 つのファイルを作成できます。

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$

ご覧のとおり、@ と [ の間の行が異なるという事実は無視されており、ファイル間で異なる行は次の行のみです。

model.FieldIAMDIFFERENTフィールド名

質問の一部としてタイトルに注意を払わなかったことをお詫びします。

答え3

データファイルをフィルタリングし、次に diff を実行します。

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

代替案としては、diffオプション -I を使用することです。パターンに一致する行は、差分比較では無視されます。比較しない行を一意に選択するパターンを選択してください。例:

diff -I 'dataexplorer.bigindex' file1 file2

関連情報