awk -i inplace在bash脚本中失效问题求助
解决方案
问题出在awk无法直接识别单引号包裹代码里的bash变量——你用单引号把awk代码括起来时,bash不会解析里面的$A和$B,awk会把它们当成自身的字段变量(比如$1代表行内第一个字段),自然无法匹配你要的字符串。
下面是两种可行的解决方式:
方法一:用awk的-v选项传递变量(推荐)
这是最规范、最不容易出问题的方式,通过-v参数把bash变量传递给awk内部变量:
先定义bash变量:
A="AABBCC" B="30"
然后执行awk命令:
awk -i inplace -v target="$A" -v new_val="$B" '{if ($1 == target) $2 = new_val; print $0}' myfile.txt
如果不想重新命名变量,也可以直接用同名变量传递:
awk -i inplace -v A="$A" -v B="$B" '{if ($1 == A) $2 = B; print $0}' myfile.txt
方法二:通过bash字符串插值传递变量(需注意特殊字符)
把awk代码用双引号包裹,同时转义awk里的$(避免bash把$1当成自己的变量),直接插入bash变量:
A="AABBCC" B="30" awk -i inplace "{if (\$1 == \"$A\") {\$2 = \"$B\"} print \$0}" myfile.txt
这种方式如果变量里包含引号、反斜杠等特殊字符,容易出现语法错误,所以仅在变量内容简单时使用。
内容的提问来源于stack exchange,提问作者Damien Lazovsky
相关产品推荐
相关产品推荐

