awk、変数、ファイルを含むawk

awk、変数、ファイルを含むawk

次のようないくつかのファイルを修正しようとしています。

  • 与えられた単語を別の単語に置き換えるには、awk文を使用します。
  • どちらの単語もawkの変数でなければなりません。

同様のことを試しましたが、コードは機能しません。

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    

どうすればいいですか?

ベストアンサー1

あなたが得る基本的なエラーは、gsub(/cuv1/, "cuv2")変数を見つけるのではなく次のものを見つけることです。ひも cuv1cuv2必要な変数を使用するには、次のようにします。

gsub(cuv1,cuv2);

awk次の問題は、実際に印刷する内容を教えてくれないことです。awk式が true と評価された場合、デフォルトのジョブはその行を印刷するためであるため、上記の修正を使用して、コマンドは置換が有効なすべての行を印刷しますが、他の行は印刷しません。

最後に、awkが元のファイルの上で変更を行うことを期待しているようです。これにはGNU awk(gawk)拡張が必要です-i inplace。しかし、これは比較的新しいものであり、移植性がありません。すべてのシステムで動作するわけではありません。これらすべてをまとめると、次のようになります(GNU awk仮定)。

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

使用sedとより簡単なソリューションperl

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

おすすめ記事