awk, awk con variables, archivo

awk, awk con variables, archivo

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 cuv1y reemplácelo con cuv2. Para utilizar las variables, desea:

gsub(cuv1,cuv2);

El siguiente problema es que en realidad no estás diciendo awkque imprimas nada. La acción predeterminada awkcuando 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 sedy perl:

sed -i "s/$word/$replace/g" "$file"
perl -i -pe "s/$word/$replace/g" "$file"

información relacionada