bash中的选择性差异

我想用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]

点赞