我想使用正则表达式来查找文件中的字符串,这些字符串中有一部分是非数字的。
这将是一个很好的字符串IDxxxxxx0123456789
。
这将是一个错误的字符串IDxxxxxx01234?6789
。
我正在使用的文件有许多不同的文本行,我特别感兴趣的是那些符合IDxxxxxx然后我希望10位数的文本。我想找到10位数不是所有数字的行。
到目前为止,我有这个,
grep "ID.\{6\}[^0-9]" myFile
如果IDxxxxxx之后的第一个字符是非数字字符,则此方法可以正常工作。所以我把它扩展如下;
grep "ID.\{6\}[^0-9]\{1,10\}" myFile
我希望IDxxxxxx
后跟1到10个非数字字符。如果第一个字符是非数字字符,而不是第二个字符,则再次有效。
我想我必须越来越近,但还不够近。请有人陪我一点。我会坚持这一点,如果我在任何人回答之前找到答案,那么我会发布我发现的内容。
感谢您的期待
(更新 - 我想要查出所有坏字符串)
答案 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
,你会说在数字之后必须有一个空格,逗号或一些终止字符串的东西,而不是任何其他字符。