
Estoy intentando modificar algunos archivos como este:
- Reemplazar una palabra dada por otra usando la declaración awk.
- Ambas palabras deben ser variables en awk.
Intenté algo como esto, pero mi código no funciona correctamente.
read word
read replace
while read file
do
if [[ -f $file ]]
then
awk -v cuv1="$word" -v cuv2="$replace" '{gsub(/cuv1/,"cuv2")}' "$file"
else
echo "File does not exist"
fi
done
¿Qué tengo que hacer?
Respuesta1
El error básico que tienes es que gsub(/cuv1/, "cuv2")
no buscará las variables, buscará lascadena cuv1
y reemplácelo con cuv2
. Para utilizar las variables, desea:
gsub(cuv1,cuv2);
El siguiente problema es que en realidad no estás diciendo awk
que imprimas nada. La acción predeterminada awk
cuando una expresión se evalúa como verdadera es imprimir la línea, por lo que su comando (con la solución anterior) imprimirá cualquier línea donde funcionó el reemplazo, pero no ninguna otra.
Finalmente, parece esperar que awk realice el cambio sobre el archivo original. Para eso, necesitas la extensión GNU awk (gawk) -i inplace
. Esto, sin embargo, es relativamente nuevo y no portátil. No funcionará en todos los sistemas. Juntando todo esto, obtenemos (asumiendo GNU awk):
awk -i inplace -v cuv1="$word" -v cuv2="$replace" '{gsub(cuv1,cuv2); print;}' "$file"
Soluciones más simples usando sed
y perl
:
sed -i "s/$word/$replace/g" "$file"
perl -i -pe "s/$word/$replace/g" "$file"