我有一个示例文件,其中包含字符串
GABCDF64V3
HABDDF61WE
KABSDF6WER
HAADYF6WE2
我只需要字符串仅包含两个数字的值(字符串中的任何位置),意味着输出应该是HABDDF61WE和哈迪F6WE2仅有的。
我尝试过这个表达
grep -E '.*[0-9]{1,}.*[0-9]{1,}.*'
但输出不一样
答案1
要在 grep 中执行此操作,您需要全线由零个或多个非数字组成,后跟一个数字,后跟零个或多个非数字,后跟一个数字,最后以零个或多个非数字结束。例如
$ grep -x '[^0-9]*[0-9][^0-9]*[0-9][^0-9]*' file
HABDDF61WE
HAADYF6WE2
(仅限拉丁十进制数字)或
$ grep -Px '\D*\d\D*\d\D*' file
HABDDF61WE
HAADYF6WE2
如果您的 grep 实现不提供-x
/--line-regexp
选项,您可以使用^
and$
行锚点:
$ grep '^[^0-9]*[0-9][^0-9]*[0-9][^0-9]*$' file
HABDDF61WE
HAADYF6WE2
或者,您可能会发现整个事情在类似awk
ex 的事情中更简单。
$ awk 'gsub(/[[:digit:]]/,"&") == 2' file
HABDDF61WE
HAADYF6WE2
(gsub
返回替换的数量)。你可以用 Perl 做类似的事情tr
。
答案2
awk -F '[0-9]' 'NF==3' file
按数字分割后,具有 3 个字段的行就是具有 2 个数字的行。