grep中的正则表达式在字符串中查找非数字字符

时间:2012-06-16 13:28:10

标签: regex grep

我想使用正则表达式来查找文件中的字符串,这些字符串中有一部分是非数字的。

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

这将是一个错误的字符串IDxxxxxx01234?6789

我正在使用的文件有许多不同的文本行,我特别感兴趣的是那些符合IDxxxxxx然后我希望10位数的文本。我想找到10位数不是所有数字的行。

到目前为止,我有这个,

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

如果IDxxxxxx之后的第一个字符是非数字字符,则此方法可以正常工作。所以我把它扩展如下;

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

我希望IDxxxxxx后跟1到10个非数字字符。如果第一个字符是非数字字符,而不是第二个字符,则再次有效。

我想我必须越来越近,但还不够近。请有人陪我一点。我会坚持这一点,如果我在任何人回答之前找到答案,那么我会发布我发现的内容。

感谢您的期待

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

3 个答案:

答案 0 :(得分:2)

  grep -Po '\bID.{6}(?!\d{10}).{10}\b' inputFiles

答案 1 :(得分: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

答案 2 :(得分:0)

您正在写[^ 0-9],但^表示“每个字符,但不是其中一个字符”。 所以你必须改变它:

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

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

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