diff:如何使用“--ignore-matching-lines”选项

diff: how to use '--ignore-matching-lines' option

我有两个文件:

$ cat xx
aaa
bbb
ccc
ddd
eee

$ cat zz
aaa
bbb
ccc
#ddd
eee

我想区分它们,同时忽略评论。

我尝试了所有可能的排列,但没有任何效果:

diff --ignore-matching-lines='#' -u xx zz
diff --ignore-matching-lines='#.*' -u xx zz
diff --ignore-matching-lines='^#.*' -u xx zz

如何区分两个文件,同时忽略给定的正则表达式,例如以 # 开头的任何内容?

diff 中的 -I 选项不是这样工作的,请参阅此 Giles's comment on Unix.SE and also on the man page - 1.4 Suppressing Differences Whose Lines All Match a Regular Expression

简而言之,如果文件之间的所有差异(insertions/deletions 或更改)与定义的 RE 相匹配,-I 选项将起作用。在您的情况下,您的两个文件之间的差异,如输出

中所示
diff f1 f2
4c4
< ddd
---
> #ddd

即两个文件中的第 4 行更改,ddd#ddd 是手册页中定义的“帅哥”,它们与您的任何 RE ##.*^#.*。因此,当存在这种无差别时,操作将是同时打印匹配和不匹配的行。引用手册,

for each nonignorable change, diff prints the complete set of changes in its vicinity, including the ignorable ones.

如果文件 f1 不包含行 ddd,即

,同样的方法会更好

f1

aaa
bbb
ccc
eee

f2

aaa
bbb
ccc
#ddd
eee

在做什么

diff f1 f2
3a4
> #ddd

只会产生一个“大块头”,#ddd 可以用 ^# 之类的模式标记为忽略,即忽略任何以 # 开头的行see 将产生所需的输出(无行)

diff -u -I '^#' f1 f2 

因此,假设您的输入包含 f1 中未注释的行 ddd,定义 RE 以匹配已注释和未注释的行并不简单。但是 diff 确实支持包含多个 -I 标志作为

diff -I '^#' -I 'ddd' f1 f2

但是不能有效,因为您无法事先知道要包含在忽略模式中的排除模式。

作为解决方法,您可以简单地忽略任何一个文件中以 # 开头的行,然后再将其传递给 diff,即

diff <(grep -v '^#' f1) <(grep -v '^#' f2)
4d3
< ddd