Eu quero validar um arquivo de texto com um script.
O arquivo para validar é:
FDFHDK JKL
1545665 152
HDKFHDK UHG
YRYRUBH DFG
867HDKE WER
As linhas válidas devem corresponder à regex '[A-Z]{7}+[[:space:]]+[A-Z]{3}'
.
Se todas as linhas forem válidas, o script mostrará uma mensagem informando que o arquivo está OK.
Se houver pelo menos uma linha que não corresponda à regex, o script deve mostrar uma mensagem e exibir as linhas que não correspondem à regex.
O roteiro é:
#!/usr/bin/env bash
result=""
output=$(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1" |wc -l)
if [[ $output > 0 ]]
then
echo "These lines don't match:"
result="${resultado} $(grep -vE '[A-Z]{7}+[[:space:]]+[A-Z]{3}' "$1") \n"
echo -e $result
else
echo "The text file is valid"
fi
A saída esperada é
These lines don't match
FDFHDK JKL
1545665 152
867HDKE WER
Mas estou ficando
These lines don't match:
FDFHDK JKL 1545665 152 867HDKE WER
Portanto, o script real não está levando em consideração a quebra de linha.
Não há absolutamente nenhuma razão para usar uma variável intermediária para armazenar a saída de comandos apenas para realizar um teste ou produzir esses dados.
A expressão regular foi corrigida para excluir o extra
+
após{7}
. Aif
instrução testa o status de saída degrep
diretamente. Ogrep
comando naif
instrução, e mais tarde, usa-x
para forçar uma correspondência de linha inteira, e a primeiragrep
instrução usa-q
para parar na primeira correspondência sem produzir nada.O problema real em seu código é usar
$result
sem aspas, o que faz com que o shell divida o valor em espaços, tabulações e novas linhas e, em seguida, faça globing de nome de arquivo nas palavras geradas. O conjunto final de palavras é então dado como argumentos para oecho
qual as imprime com espaços como delimitadores.Se você estiver preocupado em executar
grep
duas vezes, execute-o apenas uma vez e armazene a saída dele em, por exemplo, um arquivo temporário:Proponho esta alternativa:
Nota da resposta de @they :