
Me pregunto cómo puedo comprobar el final del archivo en el bucle while. Lo que estoy haciendo aquí es que si hay alguna palabra, como "piña", "manzana", "cebolla", "naranja", etc., quiero encontrar líneas que incluyan palabras específicas usando el comando grep y hacer algún comentario. "ventana". Por ejemplo, si uso grep 'a' 'file'
, encontrará "piña", "manzana" y "naranja". Luego, finalmente quiero imprimirlo como "piña, ventana, manzana, ventana, naranja, ventana", algo como esto. Entonces, me gustaría crear alguna condición en el bucle while o for. Cualquier ayuda será muy apreciada.
editar: entradas de muestra
apple
banana
pineapple
orange
mandu
ricecake
meat
juice
milk
onion
green onion
Resultados esperados al usar el comando grep -->grep 'a' 'file name'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Respuesta1
Usando awk
Para imprimir window
después de cada línea que coincida a
:
$ awk '/a/{print; print "window"}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Cómo funciona
/a/{...}
selecciona líneas que coinciden con la expresión regular a
. Para cada una de estas líneas, se ejecutan los comandos entre llaves.
print
imprime la línea que contiene la coincidencia
print "window"
impresiones window
.
Usando sed
$ sed -n '/a/{s/$/\nwindow/; p}' filename
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Cómo funciona
-n
le dice a sed que no imprima a menos que así lo indiquemos explícitamente.
/a/{...}
selecciona líneas que coinciden con la expresión regular a
. Para esas líneas, se ejecutan los comandos entre llaves.
s/$/\nwindow/
agrega una nueva línea y window
después del final de la línea actual.
p
huellas dactilares.
Respuesta2
$ grep 'a' file | sed 'a\window'
apple
window
banana
window
pineapple
window
orange
window
mandu
window
ricecake
window
meat
window
Esto usa su comando original grep
y luego agrega la palabra window
después de cada línea resultante usando el a
comando ("añadir") en GNU sed
(el estándar sed
requiere una nueva línea después \
y al final del texto insertado, pero GNU sed
es un poco más indulgente).
Alternativamente, usando solo 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
La sed
expresión imprime cada línea que contiene la letra a
y luego agrega la cadena window
.
Respuesta3
La forma shell se puede utilizar así:
while IFS= read -r line || [ -n "$line" ]; do
case "$line" in
*a*) printf "%s\nwindow\n" "$line"
esac
done < input.txt
Esto combina el while IFS= read -r line; do...done < file.txt
bucle típico para leer archivos, case
una declaración para hacer coincidir líneas que contienen un carácter particular y printf
para imprimir esa window
línea adicional.