awk, awk mit Variablen, Datei

awk, awk mit Variablen, Datei

Ich versuche, einige Dateien wie folgt zu ändern:

  • Ersetzen eines gegebenen Wortes durch ein anderes mithilfe einer Awk-Anweisung.
  • Beide Wörter müssen Variablen in awk sein.

Ich habe so etwas versucht, aber mein Code funktioniert nicht richtig.

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    

Was soll ich machen?

Antwort1

Der grundlegende Fehler besteht darin, dass gsub(/cuv1/, "cuv2")nicht nach den Variablen gesucht wird, sondern nachSchnur cuv1und ersetzen Sie es durch cuv2. Um die Variablen zu verwenden, benötigen Sie:

gsub(cuv1,cuv2);

Das nächste Problem ist, dass Sie eigentlich awknichts drucken möchten. Die Standardaktion, awkwenn ein Ausdruck als wahr ausgewertet wird, besteht darin, die Zeile zu drucken. Ihr Befehl (mit der obigen Korrektur) druckt also alle Zeilen, bei denen der Ersatz funktioniert hat, aber keine anderen.

Schließlich scheinen Sie zu erwarten, dass awk die Änderung an der Originaldatei vornimmt. Dafür benötigen Sie die GNU awk (gawk)-Erweiterung -i inplace. Diese ist jedoch relativ neu und nicht portierbar. Sie funktioniert nicht auf allen Systemen. Wenn wir all dies zusammenfassen, erhalten wir (unter der Annahme von GNU awk):

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

Einfachere Lösungen mit sedund perl:

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

verwandte Informationen