
Estou tentando modificar alguns arquivos como este:
- Substituir uma determinada palavra 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?
Responder1
O erro básico que você tem é que gsub(/cuv1/, "cuv2")
não vai procurar as variáveis, vai procurar ascorda cuv1
e substitua-o por cuv2
. Para usar as variáveis, você deseja:
gsub(cuv1,cuv2);
O próximo problema é que você não está dizendo awk
para imprimir nada. A ação padrão de awk
quando uma expressão é avaliada como verdadeira é imprimir a linha, então seu comando (com a correção acima) imprimirá todas as linhas onde a substituição funcionou, mas não quaisquer outras.
Finalmente, você parece estar esperando que o awk faça a alteração no 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. Juntando tudo isso, obtemos (assumindo 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"