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"

相关内容