我想用diff比较两个文件,但我想跳过一些行.我想跳过的行标记为注释,但仅在第一个文件中.
为了便于复制/粘贴测试,我使用process substitution编写diff命令:
$diff -y <(echo -e "aaa\nbbb\n#ccc\nddd") <(echo -e "AAAAAA\nbbb\nccc\nddd")
aaa | AAAAAA
bbb bbb
#ccc | ccc
ddd ddd
$
可以看出,第一行和第三行都标记为diff(|).由于#符号,我不想在diff中使用第三行.我可以使用-I选项忽略匹配的行,但这要求两个文件都匹配模式.
$diff -y -I "#.*" <(echo -e "aaa\nbbb\n#ccc\nddd\n#eee") <(echo -e "AAAAAA\nbbb\nccc\nddd\n#EEEE")
aaa | AAAAAA
bbb bbb
#ccc | ccc
ddd ddd
#eee #EEEE
$
有没有办法只根据第一个文件忽略行?
编辑:
我忘了写我需要diff的返回值(echo $?)来告诉我是否有任何不匹配的行(不包括那些我不想检查的行).
最佳答案 使用grep -vE“^#”来过滤结果,并获得有意义的返回值,你可以使用wc -l来计算非公共线;
A=$(diff -y --suppress-common-lines <(echo -e "aaa\nbbb\n#ccc\nddd\neee") <(echo -e "AAAAAA\nbbb\nccc\nddd\n#EEEE") | grep -vE "^#" );
echo "$A";
return $(echo "$A" | wc -l);
输出;
aaa | AAAAAA
eee | #EEEE
回报值;
2
如果你想直接在脚本中使用这个例子,而不是在函数中使用exit而不是return或if [$(echo“$A”| wc -l)-gt 0]而不是if [$? -gt 0]