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"

相關內容