![检查文件中每行的结尾是否以字母结尾,后跟 8 位数字](https://linux22.com/image/1156484/%E6%A3%80%E6%9F%A5%E6%96%87%E4%BB%B6%E4%B8%AD%E6%AF%8F%E8%A1%8C%E7%9A%84%E7%BB%93%E5%B0%BE%E6%98%AF%E5%90%A6%E4%BB%A5%E5%AD%97%E6%AF%8D%E7%BB%93%E5%B0%BE%EF%BC%8C%E5%90%8E%E8%B7%9F%208%20%E4%BD%8D%E6%95%B0%E5%AD%97.png)
我在检查文件的每一行是否以字母结尾时遇到了问题,(A-Z (always capital))
后面跟着 8 位数字(无论哪个数字都行)。因此,我有许多文件,每个文件的内容如下所示:
Nc1nc2cc3OCCOc3cc2s1 A10000001
CCN(CC)C1CCN(Cc2cc(I)cc(I)c2O)CC1 B100000002
CCN(CC)C1CCN(Cc2cc(cc(I)c2O)C#CCO)CC1 C10000003
此“字符串”和带有数字的字母之间总是有一个空格。因此,在此示例中,B100000002
字母后面有 9 位数字。由于我手动完成了大部分工作,因此我想检查我的文件中是否存在错误。有人能帮我使用一些 bash 命令,以便我查看哪些行具有不同的、不正确的模式吗?
谢谢!
答案1
您可以使用grep
来获取不符合规则的行:
grep -v ' [[:upper:]][0-9]\{8\}$' file*
- 空间与自身相匹配
[[:upper:]]
匹配任意大写字母[0-9]
匹配数字\{8\}
是一个“量词”,这意味着前面的构造必须重复 8 次$
匹配行末-v
显示的行是不是匹配
答案2
你可以用 perl 正则表达式来 grep:
grep -P ' [a-zA-Z]{1}[0-9]{8}$'
-P
: 用于 perl 正则表达式
:正则表达式以空格开头,因为你需要在大写字母前有一个空格
[a-zA-Z]{1}
:恰好 1 个字母字符,小写或大写(可以删除 az 而只保留大写,即 [AZ]{1})
[0-9]{8}
:恰好 8 个数字字符
$
: 行结束
如果要显示与模式不匹配的行,只需-v
向 grep 命令添加选项。
如果要显示行号,请添加-n
选项。
grep -Pvn ' [a-zA-Z]{1}[0-9]{8}$'