grep中的Regex用于在字符串中查找非数字字符

grep中的Regex用于在字符串中查找非数字字符,regex,grep,Regex,Grep,我想使用正则表达式来查找文件中包含部分非数字字符串的字符串 这将是一个很好的字符串IDxxxxxx0123456789 这将是一个错误的字符串IDxxxxxx01234?6789 我正在grepping的文件有许多不同的文本行,我特别感兴趣的是那些符合IDxxxxxx的,我希望是10位。我想找出10位数字不是全部数字的行 到目前为止我有这个 grep "ID.\{6\}[^0-9]" myFile 如果IDxxxxxx后面的第一个字符是非数字字符,则此操作正常。因此,我将其扩展如下: gr

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

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

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

我正在grepping的文件有许多不同的文本行,我特别感兴趣的是那些符合IDxxxxxx的,我希望是10位。我想找出10位数字不是全部数字的行

到目前为止我有这个

 grep "ID.\{6\}[^0-9]" myFile
如果IDxxxxxx后面的第一个字符是非数字字符,则此操作正常。因此,我将其扩展如下:

 grep "ID.\{6\}[^0-9]\{1,10\}" myFile
我希望这意味着
IDxxxxxx
后跟1到10个非数字字符。如果第一个字符是非数字字符,但第二个字符不是,则此操作同样有效

我想我一定离得很近了,但还不够近。谁能在这个问题上给我指点方向吗。我会坚持下去,如果我在别人回答之前找到了答案,那么我会把我找到的贴出来

期待中的感谢

(更新-我想清除所有坏字符串)

这是您的字符串:

$> cat ./text 
This would be a good string IDxxxxxx0123456789
This would be a bad string IDxxxxxx01234?6789
其思想是使用
--反转匹配
标志

$> grep --perl-regex --invert-match "ID.{6}[0-9]{10}" ./text 
This would be a bad string IDxxxxxx01234?6789

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

"ID.{6}[0-9]{1,10}\b"
按照您的方式,如果第一个不是数字,字符串将匹配,因为您的范围{1,10}必须是非数字字符

此外,还需要添加
\b
。否则它将匹配第二个字符串。相反,使用
\b
,您的意思是数字后面必须有空格、逗号或终止字符串的内容,而不是任何其他字符

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