比较两个文件,忽略 @ 和 [ 之间的字符串

比较两个文件,忽略 @ 和 [ 之间的字符串

我正在比较两个文件。我试图忽略之后@和之前的字母数字字符[。一条线看起来像

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使用以下命令来获取这两个文件:

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.FieldIAMDIFFERENTfieldName

我很抱歉没有仔细注意你的标题作为问题的一部分。

答案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

相关内容