Grep точное количество цифр и некоторые другие символы

Я хотел бы проанализировать файл, содержащий 5 цифр чисел, разделенных запятой или тире, строки вроде:
12345,23456,34567-45678,12345-23456,34567

Моя цель – найти строки, которые имеют неправильное форматирование, например. строки, которые содержат числа, которые не состоят из 5 цифр, разделяются другими символами, кроме запятой или тире.

Я попытался egrep файл с:

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

  • но если у меня 6-значное число, оно соответствует, и строка не отображается
  • и если у меня есть 4-значное число, оно не сопоставляется, а другие номера из этой же строки совпадают, и строка не отображается

Чтобы указать содержимое строк:

  • номер должен состоять из 5 цифр
  • диапазоны определяются тире, например 12345-12389
  • строка может содержать что угодно: от одного номера до нескольких номеров и диапазонов в любом порядке

Любые предложения, пожалуйста?

 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" 

Для хорошего решения grep см . Ответ Стефана . В качестве альтернативы, вот Perl:

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

Это разделит каждую строку ввода на , или - и затем будет искать члены массива split, который не состоит из ровно 5 чисел. Если какой-либо найден, строка печатается.

Вам не нужна 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