我想解析一个包含由逗号或破折号分隔的 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