Grep 精确的数字位数和一些其他字符

Grep 精确的数字位数和一些其他字符

我想解析一个包含由逗号或破折号分隔的 5 位数字的文件,行如下:
12345,23456,34567-45678,12345-23456,34567

我的目标是找到格式不正确的行,例如。包含不由 5 位数字组成的数字的行,由逗号或破折号以外的其他字符分隔。

我尝试使用以下命令来egrep该文件:

cat file.txt | egrep -v [-,]*[0-9]{5}[,-]*

  • 但如果我有一个 6 位数字,它会匹配,并且不会显示该行
  • 如果我有一个 4 位数字,则它不匹配,但同一行中的其他数字匹配,并且该行不显示

要指定行内容:

  • 号码必须为 5 位数字
  • 范围用破折号定义,例如 12345-12389
  • 一行可以包含从单个数字到任意顺序的多个数字和范围的任何内容

请问有什么建议吗?

答案1

grep -vxE '([0-9]{5}[,-])*[0-9]{5}'

会报告不正确的行。

或者如果您也想禁止12345-12345-12345

num='[0-9]{5}'
num_or_range="$num(-$num)?"
grep -vxE "($num_or_range,)*$num_or_range"

答案2

好的grep解决方案请参见史蒂芬的回答。作为一种替代方案,这里有一个 Perl 版本:

perl -ne 'print if grep{$_!~/^\d{5}$/} split(/[,-]/); ' file 

,这将在或上分割每个输入行-,然后查找分割数组中不包含 5 个数字的成员。如果找到,则打印该行。

答案3

你不需要cat。这是否符合您的要求:

 $ grep -v -E '^([0-9]{5}(,|-))+' <FILE>

例如,如果FILE有以下内容:

12345,23456,34567-45678,12345-23456,34567
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234*23456,34567-45678,12345-23456,34567

结果将是:

$ grep -v -E '^([0-9]{5}(,|-))+' 5d
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234-23456,34567-45678,12345-23456,34567

相关内容