我有两个文件:
$ 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
f2aaa
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