
Gostaria de saber como posso verificar o final do arquivo no loop while. O que estou fazendo aqui é que se houver alguma palavra, como "abacaxi", "maçã", "cebola", "laranja" ou etc, quero encontrar linhas incluindo palavras específicas usando o comando grep e fazer algum comentário "janela". Por exemplo, se eu usar grep 'a' 'file'
, ele encontrará "abacaxi", "maçã" e "laranja". Então, finalmente quero imprimi-lo como "abacaxi, janela, maçã, janela, laranja, janela", algo assim. Então, eu gostaria de fazer alguma condição no loop while ou for. Qualquer ajuda será muito apreciada.
editar: exemplos de entradas
apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion
Resultados esperados ao usar o comando grep ->grep 'a' 'file name'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Responder1
Usando o awk
Para imprimir window
após cada linha correspondente a
:
$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Como funciona
/a/{...}
seleciona linhas que correspondem ao regex a
. Para cada linha, os comandos entre chaves são executados.
print
imprime a linha que contém a correspondência
print "window"
impressões window
.
Usando sed
$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Como funciona
-n
diz ao sed para não imprimir, a menos que solicitemos explicitamente.
/a/{...}
seleciona linhas que correspondem ao regex a
. Para essas linhas, os comandos entre chaves são executados.
s/$/\nwindow/
adiciona uma nova linha e window
após o final da linha atual.
p
impressões.
Responder2
$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
grep
Isso usa seu comando original e, em seguida, acrescenta a palavra window
após cada linha resultante usando o a
comando ("append") no GNU sed
(o padrão sed
requer uma nova linha após \
e no final do texto inserido, mas o GNU sed
é um pouco mais tolerante).
Alternativamente, usando apenas GNU sed
:
$ sed -n -e '/a/{p;a\window' -e '}' file
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
A sed
expressão imprime cada linha que contém a letra a
e depois anexa a string window
.
Responder3
O shell way pode ser usado assim:
while IFS= read -r line || [ -n "$line" ]; do
case "$line" in
*a*) printf "%s\nwindow\n" "$line"
esac
done < input.txt
while IFS= read -r line; do...done < file.txt
Isso combina o loop típico para leitura de arquivos, case
instrução para combinar linhas que contêm caracteres específicos e printf
para imprimir aquela window
linha extra.