2

我想使用正则表达式来查找文件中包含非数字部分的字符串。

这将是一个很好的字符串IDxxxxxx0123456789

这将是一个坏字符串IDxxxxxx01234?6789

我正在搜索的文件有许多不同的文本行,我对符合 IDxxxxxx 的文件特别感兴趣,然后我期望 10 位数字。我想找到 10 位数字不是全部数字的行。

到目前为止,我有这个,

 grep "ID.\{6\}[^0-9]" myFile

如果 IDxxxxxx 之后的第一个字符不是数字,这可以正常工作。所以我将其扩展如下;

 grep "ID.\{6\}[^0-9]\{1,10\}" myFile

我希望这意味着IDxxxxxx后面跟着 1 到 10 个非数字字符。如果第一个字符不是数字但不是第二个字符,这再次起作用。

我想我一定是接近了,但还不够接近。任何人都可以在这个问题上指导我一点。我会坚持这一点,如果我在任何人回答之前找到答案,那么我会发布我找到的内容。

感谢期待

(更新 - 我想找出所有坏字符串)

4

3 回答 3

2
  grep -Po '\bID.{6}(?!\d{10}).{10}\b' inputFiles
于 2012-06-16T13:37:44.757 回答
0

这是你的字符串:

$> cat ./text 
This would be a good string IDxxxxxx0123456789
This would be a bad string IDxxxxxx01234?6789

这个想法是使用--invert-match标志。

$> grep --perl-regex --invert-match "ID.{6}[0-9]{10}" ./text 
This would be a bad string IDxxxxxx01234?6789
于 2012-06-16T13:31:58.403 回答
0

您正在写 [^0-9],但^意思是“每个字符,但不是后续字符之一”。所以你必须像这样改变它:

"ID.{6}[0-9]{1,10}\b"

以您的方式,如果第一个不是数字,则字符串匹配,因为您的范围 {1,10} 必须是非数字字符。

此外,您需要添加\b. 否则它将匹配您的第二个字符串。\b相反,您是说在数字之后必须有一个空格、逗号或终止字符串的东西,而不是任何其他字符。

于 2012-06-16T13:38:09.720 回答