如何使用Regex和diff实用程序忽略特定的文件行(“-I regex”选项)?

时间:2015-07-29 08:24:32

标签: regex linux bash ubuntu diff

我正在编写自动化测试来比较HTML文件。为了比较,我使用diff linux utility

所以,第一个HTML文件1.html

<!-- just example -->
<html>
  <div id="userdata_hidden">bla bla bla</div>
  <div id="something else" >bla bla bla</div>
  <div id="waiver_id"      >bla bla bla</div>
<html>

第二个HTML文件2.html

<!-- just example -->
<html>
  <div id="userdata_hidden">bla bla bla DIFFERENCE </div>
  <div id="something else" >bla bla bla</div>
  <div id="waiver_id"      >bla bla bla DIFFERENCE </div>
<html>

Сommand比较文件:

diff -biw 1.html 2.html

结果:

3c3
<   <div id="userdata_hidden">bla bla bla</div>
---
>   <div id="userdata_hidden">bla bla bla DIFFERENCE </div>
5c5
<   <div id="waiver_id"      >bla bla bla</div>
---
>   <div id="waiver_id"      >bla bla bla DIFFERENCE </div>

Comaration工作正常,但我需要忽略包含特殊单词的行的差异 - waiver_iduserdata_hidden

diff命令-I option用于忽略数字或正则表达式匹配的行:

  

忽略与grep样式匹配的行的插入和删除   正则表达式,使用--ignore-matching-lines = regexp(-I regexp)   选项。您应该转义包含shell的正则表达式   元字符,以防止shell扩展它们。例如,   'diff -I'^ [[:digit:]]''忽略对以a开头的行的所有更改   数字。

     

但是, - 我只忽略插入或删除的行   如果hunk-every中的每个更改行都包含正则表达式   插入和每次删除 - 匹配正则表达式。其他   单词,对于每个不可忽略的变化,diff打印完整的一组   附近的变化,包括可忽略的变化。

     

您可以为要忽略的行指定多个正则表达式   通过使用多个-I选项。 diff尝试匹配每一行   反对每个正则表达式。

因此,我可以使用正则表达式忽略与waiver_iduserdata_hidden的行的联合。如果文件没有差异diff则不向控制台返回任何内容(空字符串)。

问题:

  1. 如何编写正则表达式,排除包含单词waiver_id或userdata_hidden的字符串?

  2. 使用diff选项和正则表达式查看-I命令的正确程度如何?

  3. P.S。不幸的是,这个变种不起作用:

    diff -biw -I '^(?!.*(?:userdata_hidden|waiver_id))' 1.html 2.html
    

1 个答案:

答案 0 :(得分:1)

  

我需要检查该字符串是否包含单词waiver_iduserdata_hidden

^(?!.*\bwaiver_id\b)(?!.*\buserdata_hidden\b)

如果您不希望显示任何一个字符串。

^(?!.*\b(?:userdata_hidden|waiver_id)\b)

RUbular