【问题标题】:grep regular expression not matching zero correctlygrep 正则表达式不正确匹配零
【发布时间】:2013-10-08 06:02:39
【问题描述】:

我在使用 grep 正则表达式时遇到了一些问题。我正在尝试 grep 一些字符都是小写的 ascii 编码的十六进制数据

我的grep语句如下:

grep -E "01[a-f0-9]{2}81[a-f0-9]0" log.log

文件中的大多数匹配项看起来都不错,但有许多匹配项如下

010481ec070000
01b481ec070000
01508129070521

我不知道为什么这些字符串是匹配的。它们不应该匹配,因为 81 后面必须跟一个十六进制字符,然后是一个零。

我做了一些进一步的调查。如果我将这三个字符串放在一个单独的文件中,然后 grep 该文件。我没有匹配。不太清楚这里发生了什么。

这是 grep 2.12。

这里是文件中原始数据的一部分。这些都是匹配的行。并且导出 LC_ALL=C 后仍然匹配

input data : 011a81a907000b3002004070eaa3d2240fa81272011763dd0040002001
input data : 010481e1070000
input data : 010481ea070000
input data : 011a81a207000b980f0040681f2b11d2f60202dc003669ba0140006100
input data : 014681ab07002140010040d2e457f8c00494ed5e014362bf0240006101ae0500404ee311f402feb2165401c562450240005801db08044068f09ff6a6005af953008062470640004d01
input data : 010481e3070000
input data : 013081ac070016c0000040f6d963fcb4f7e8127c0103637b0140006f01bf0200408ae344fdd2043eed72018362a30240006f01
input data : 010481e4070000
input data : 011a81ad07000b5c06006064f96804901154fed2008e66ff0f4000a401
input data : 010481e5070000
input data : 014681ae070021170d004069f196134cf6a805b4000769b6034000be014e0e004092e80820da0b82fbfa000c6c5c014000bf01880a004020d9ce21f4efd40954011469a1004000ae01
input data : 011a81a607000bef0d0060d60dd6edf8f18e104e015b63d3014000da00
input data : 011a81af07000b4c0800401cfbb0184a0c28f7fa00516931024000e101
input data : 015c81a007002c12050020f2ff640028007afd00801205f70540000400280c00404f016a0a10fbd0012a00e769ff0f400018005d020040e3fabd21e00830f4d200c769d80140000300030a004042030

【问题讨论】:

  • 似乎是旧的 grep 版本!
  • 在这里,您的 grep 命令找不到与您的输入匹配的内容(3 行)。 grep 版本gnu grep 2.14
  • 有些可疑。我也无法重现您的结果,并且正则表达式很简单,因此不太可能出现错误。您确定要向我们展示正在执行的正则表达式以及整个输入行吗?它可能与您未显示的行的其他部分匹配吗?您不会锚定到行首或行尾...
  • 我做了一些进一步的调查。如果我将这三个字符串放在一个单独的文件中,然后 grep 该文件。我没有匹配。不太清楚这里发生了什么。
  • 显示整个输入行,而不仅仅是您希望匹配的字符串。

标签: regex linux grep


【解决方案1】:

尝试使用环境变量LC_ALL=C 执行它。语言环境会影响 grep 解释字符范围的方式。

【讨论】:

    【解决方案2】:

    假设命令和你说的完全一样......引号是正确的,在 grep 获取参数之前没有文件名 glob,你没有 {0} 而不是 0,等等......

    我想知道 -a (将二进制文件视为文本)是否是罪魁祸首。二进制输出可以由终端处理。 (这就是我们改变颜色或做诅咒定位或诸如此类的方式。)

    如果你有二进制删除了行的一部分怎么办?说 control-H 的...

    如果通过 od -c(或者可能是 od -aod -ta 如果你有的话)。

    如果你将输出存储在一个文件中,然后用 grep 提取一行,然后用 od 查看它会发生什么?

    【讨论】:

      猜你喜欢
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2016-05-05
      • 2012-12-22
      相关资源
      最近更新 更多