Ignorando linhas em branco à direita
Aqui está uma abordagem usando awk
:
echo "$TEST" | tac | awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }' && echo "Found A Single Line"
Como funciona:
-
echo "$ TEST"
Isso pega qualquer variável de shell que nos interessa e envia para o padrão.
-
tac
Isso inverte a ordem das linhas para que a última linha seja retornada primeiro. Depois de executar tac
, as linhas finais se tornam as linhas principais.
(O nome tac
é o reverso de cat
, porque o tac
faz o que o cat
faz, mas ao contrário).
-
awk 'f==0 && /./ {f=NR} END{if(f==NR){exit 0}; exit 1 }'
Isso armazena o número da linha da primeira linha não vazia na variável f
. Depois de ler todas as linhas, ele compara f
com o número total de linhas, NR
. se f
for igual a NR
, teríamos apenas uma única linha (ignorando os espaços em branco iniciais) e sairíamos com o código 0. Se houvesse uma ou mais linhas depois da primeira linha em branco, ela sairia com o código '.
-
&& echo "Found A Single Line"
Se awk
sair com o código 0, a instrução echo
será executada.
Ignorando as linhas em branco iniciais e finais
Ao criar uma variável awk
adicional, podemos estender o teste para ignorar as linhas em branco iniciais e finais:
echo "$TEST" | awk 'first==0 && /./ {first=NR} /./ {last=NR} END{if(first==last){exit 0}; exit 1 }' && echo " Found A Single Line"
Como essa versão do código awk
manipula espaços em branco iniciais e finais, tac
não é mais necessário.
Tendo o código awk
um pedaço de cada vez:
-
first==0 && /./ {first=NR}
Se a variável first
for zero (ou ainda não tiver sido definida) e a linha tiver um caractere, qualquer caractere, defina first
como o número da linha. Quando awk
terminar de ler as linhas, first
será definido para o número da linha da primeira linha não vazia.
-
/./ {last=NR}
Se a linha tiver algum caractere, defina a variável last
como o número da linha atual. Quando awk
terminar de ler todas as linhas, essa variável terá o número da linha da última linha não vazia.
-
END{if(first==last){exit 0}; exit 1 }
Isso é executado depois que todas as linhas foram lidas. Se first
for igual a last
, teremos linhas zero ou não-brancas e awk
sairá com o código 0
. Caso contrário, sai com o código 1
. O script de shell pode testar o código de saída normalmente com if
declarações ou &&
ou ||
.