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")変数を探すのではなく、 cuv1を に置き換えますcuv2。変数を使用するには、次の操作を行います。

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"

関連情報