awk, awk com variáveis, arquivo

3

Estou tentando modificar alguns arquivos desta forma:

  • Substituindo uma palavra dada por outra usando a instrução awk.
  • Ambas as palavras devem ser variáveis no awk.

Eu tentei algo assim, mas meu código não funciona corretamente.

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    

O que devo fazer?

    
por Robert Corman 06.04.2017 / 14:33

1 resposta

2

O erro básico que você tem é que gsub(/cuv1/, "cuv2") não procurará as variáveis, procurará a string cuv1 e substituirá por cuv2 . Para usar as variáveis, você quer:

gsub(cuv1,cuv2);

O próximo problema é que você não está realmente dizendo awk para imprimir nada. A ação padrão de awk quando uma expressão é avaliada como true é imprimir a linha, portanto, seu comando (com a correção acima) imprimirá todas as linhas em que a substituição funcionou, mas nenhuma outra.

Finalmente, você parece estar esperando que o awk faça a mudança no topo do arquivo original. Para isso, você precisa da extensão GNU awk (gawk) -i inplace . Isso, no entanto, é relativamente novo e não é portátil. Não funcionará em todos os sistemas. Colocando tudo isso junto, obtemos (assumindo o GNU awk):

awk -i inplace  -v cuv1="$word" -v cuv2="$replace" '{gsub(cuv1,cuv2); print;}' "$file"

Soluções mais simples usando sed e perl :

sed -i "s/$word/$replace/g" "$file"
perl -i -pe "s/$word/$replace/g" "$file"
    
por 06.04.2017 / 15:02

Tags