diff:如何使用"--忽略匹配线"选项



我有两个文件:

$ 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对Unix的评论。1.4抑制行都匹配正则表达式

的差异简而言之,如果文件之间的所有差异(插入/删除或更改)与定义的正则匹配,则-I选项有效。在您的示例中,两个文件之间的差异,如输出

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

。两个文件的第4行变化,ddd#ddd是";;如手册页中定义的那样,一起不匹配任何您的REs#,#.*^#.*。因此,当这种无关性存在时,将同时打印匹配行和不匹配行。引用手册,

对于每个不可忽略的变化,diff打印其附近的完整的变化集,包括可忽略的变化。

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

),则同样的操作效果会更好。f1

aaa
bbb
ccc
eee

f2
aaa
bbb
ccc
#ddd
eee

在哪里做

diff f1 f2
3a4
> #ddd

将只产生一个"粗号",#ddd可以用类似^#的模式标记为忽略,即忽略任何以#开头的行,正如您所看到的,将产生所需的输出(没有行)

diff -u -I '^#' f1 f2 

因此,给定您的输入包含f1中的未注释行ddd,定义一个正则来匹配已注释行和未注释行将不那么简单。但是diff确实支持包含多个-I标志作为

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

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

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

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

相关内容

  • 没有找到相关文章

最新更新