grep -vxE '([0-9]{5}[,-])*[0-9]{5}'
Informaria as linhas incorretas.
Ou se você também quiser proibir 12345-12345-12345
:
num='[0-9]{5}'
num_or_range="$num(-$num)?"
grep -vxE "($num_or_range,)*$num_or_range"
Gostaria de analisar um arquivo contendo números de 5 dígitos separados por vírgula ou traço, linhas como:
12345,23456,34567-45678,12345-23456,34567
Meu objetivo é encontrar linhas com formatação incorreta, por exemplo. linhas que contêm números que não são compostos por 5 dígitos separados por outros caracteres além de vírgula ou traço.
Eu tentei egrep o arquivo com:
cat file.txt | egrep -v [-,]*[0-9]{5}[,-]*
Para especificar o conteúdo das linhas:
Alguma sugestão, por favor?
Para uma boa solução grep
, consulte a resposta de Stéphane . Como alternativa, aqui está um Perl:
perl -ne 'print if grep{$_!~/^\d{5}$/} split(/[,-]/); ' file
Isso dividirá cada linha de entrada em ,
ou -
e, em seguida, procurará membros da matriz dividida que não contenham exatamente cinco números. Se algum for encontrado, a linha é impressa.
Você não precisa de cat
. Isso faz o que você quer:
$ grep -v -E '^([0-9]{5}(,|-))+' <FILE>
Por exemplo, se FILE
tiver o seguinte conteúdo:
12345,23456,34567-45678,12345-23456,34567
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234*23456,34567-45678,12345-23456,34567
o resultado seria:
$ grep -v -E '^([0-9]{5}(,|-))+' 5d
1,2
12345*23456,34567-45678,12345-23456,34567
123456
1234-23456,34567-45678,12345-23456,34567