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