【问题标题】:How ignore specific lines of file using Regex and diff utility ("-I regex" option)?如何使用 Regex 和 diff 实用程序(“-I regex”选项)忽略特定的文件行?
【发布时间】:2015-10-20 02:48:46
【问题描述】:

我正在编写自动化测试来比较 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>

比较文件的命令:

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 的正则表达式 元字符以防止外壳扩展它们。例如, 'diff -I '^[[:digit:]]'' 忽略对以 a 开头的行的所有更改 数字。

但是,-I 只忽略插入或删除的行 如果大块中的每个更改的行都包含正则表达式 - 每个 插入和每次删除——匹配正则表达式。其他 换句话说,对于每个不可忽略的变化,diff 打印完整的集合 附近的变化,包括可忽略的变化。

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

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

问题:

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

  2. diff 命令在使用-I 选项和正则表达式时应该看起来有多正确?

附:不幸的是,这个变种不起作用:

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

【问题讨论】:

  • 这看起来真的像一个“做我的家庭作业”类型的问题......
  • @JérémieAstori Astori,不,我正在用 ruby​​ 编写自动化测试。尝试使用 bash diff 命令比较两个 HTML 和 pdf 文件
  • 这就是当有人只是提出解决方案而没有发布实验时的样子:-) 请包括您迄今为止尝试过的内容及其结果,而不仅仅是从头开始的答案。
  • 话虽如此,如果性能不是最重要的,并且您只有 2 根针(您的 2 个字),您可以使用类似于 !str.match('waiver_id') &amp;&amp; !str.match('userdata_hidden') 的东西,避免自己的痛苦正则表达式...
  • 几天后回来,现在这是一个真正的问题 :) 完成后不要忘记选择正确的答案!

标签: regex linux bash ubuntu diff


【解决方案1】:

我需要检查字符串不包含单词waiver_iduserdata_hidden

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

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

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

RUbular

【讨论】:

  • 字符串不应该包含任何这个词(或代替and)
  • 它应该看起来像/^(?!.*\bwaiver_id\b)|(?!.*\buserdata_hidden\b)$/,不是吗?
  • @bmalets 更改为或
  • @bmalets:不。你的正则表达式根本没有意义,因为^ 属于第一个分支,$ 属于第二个分支。您的意思可能是/^((?!.*\bwaiver_id\b)|(?!.*\buserdata_hidden\b))/,但这是错误的,因为这意味着(无 waiver_id)或(无 userdata_hidden),这意味着只要两者不同时出现,就允许它们。
  • @cremno 特殊词可以在字符串/行的任何部分
猜你喜欢
  • 2020-04-03
  • 2022-01-22
  • 1970-01-01
  • 2011-01-20
  • 2017-03-27
  • 1970-01-01
  • 2021-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多