
Básicamente, todo lo que quiero hacer es modificar las salidas si la entrada coincide con un filtro, pero la parte que se modifica no es la que se filtra (o yo usaría sed
). El problema hasta ahora es que mi awk
solo genera las líneas modificadas.
Ejemplo rápido, ponga esto en test.txt:
orange beet pear cowmilk
apple pear berry cowmilk
orange melon cherry cowmilk
Si uso el código:
awk /orange/'{gsub(/cow/,"cow~"); print}' test.txt
Yo obtengo:
orange beet pear cow~milk
orange melon cherry cow~milk
Cuando preferiría obtener:
orange beet pear cow~milk
apple pear berry cowmilk
orange melon cherry cow~milk
Veo que te sirve ||
awk, pero no he podido descubrir cómo hacer que encaje con el gsub anterior.
Para una apreciación adicional, lo que realmente me gustaría hacer es agregar color en lugar de ~
, pero eso se rompe por completo, es decir
awk /orange/'{gsub(/cow/,"cow'\e[1;34m'"); print}' test.txt
me da un error por \
no ser el final de la línea.
Respuesta1
Para el color, debe especificar el carácter ESC real (no la forma de escape \e
). El valor es hexadecimal \x1B
u octal \033
. Los siguientes scripts colorean el guión -
e imprimen todas las líneas de entrada.
awk '/orange/{gsub(/cowmilk/,"cow\x1B[1;34m-\x1B[0mmilk")} {print}' "$file"
sed '/orange/{s/cowmilk/cow\x1B[1;34m-\x1B[0mmilk/g}' "$file"
Respuesta2
Para imprimir cada línea después de modificar solo algunas, agregue una condición separada que siempre se evalúe como verdadera, como ( 1
):
awk '/orange/{gsub("cow", "cow~")} 1' "$file"
También podrías tener {print}
explícitamente:
awk '/orange/{gsub("cow", "cow~")} {print}' "$file"
Recuerde que cada declaración awk consta de una condición y una cláusula de declaración:
condition {statements}
Pero cada uno de estos es opcional, si no incluye{statements}
, entonces {print}
se utiliza. Si no incluyescondition
, entonces 1
se utiliza.