awk脚本替换双引号内第二次出现的字符串
我在编写脚本来替换双引号内的字符串时遇到问题。文件部分如下所示:awk脚本替换双引号内第二次出现的字符串,awk,replace,double-quotes,Awk,Replace,Double Quotes,我在编写脚本来替换双引号内的字符串时遇到问题。文件部分如下所示: "regA~1" : "FF_NODE~94" "regA~2" : "FF_NODE~105" "regA~3" : "FF_NODE~116" "regA~4" : "FF_NODE~127" "regA~5" : "FF_NODE~138" "regA~6" : "FF_NODE~149" "regA~7" : "FF_NODE~154" "regA~8"
"regA~1" : "FF_NODE~94"
"regA~2" : "FF_NODE~105"
"regA~3" : "FF_NODE~116"
"regA~4" : "FF_NODE~127"
"regA~5" : "FF_NODE~138"
"regA~6" : "FF_NODE~149"
"regA~7" : "FF_NODE~154"
"regA~8" : "FF_NODE~155"
"regA~9" : "FF_NODE~156"
"regA~1" : "FF_NODE~95"
"regA~11" : "FF_NODE~96"
如果我这样做,它会起作用
awk '/"regA~1"/{c++;if(c==2){sub("regA~1","regA~10");}}1' file > file_out
但是,当我试图将其作为一个脚本,在其中传递变量regA~1和c的值时,它就不起作用了
s="regA~1";
r="regA~10";
n=2;
awk -v search="$s" -v replace="$r" -v count=$n '/search/{c++;if(c==count){sub(search,replace);}}1' file > file_out
我也试过了
awk -v search=$s -v replace=$r -v count=$n '/search/{c++;if(c==count){sub(search,replace);}}1' file > file_out
匹配作为字符串存储在变量中的RE所需的语法为
$0 ~ var
不是
感谢埃德·莫顿的提示。下面是bash脚本,以防任何人需要类似的东西。不是很复杂,但对我来说很有用
#!/bin/bash
# Replaces a specific occurrence of a search string with a replace string
if [ $# -lt 4 ] ; then
echo -e "Wrong number of parameters."
echo -e "Usage:"
echo -e "repnthstr file search replace n"
echo -e "repnthstr fileext search replace n"
exit 1
fi
for file in $1
do
if [ -f $file -a -r $file ]; then
awk -v search=$2 -v replace=$3 -v cnt=$4 '$0 ~ search{c++;if(c==cnt){sub(search,replace);}}1' "$file" > temp && mv temp "$file"
else
echo "Error: Cannot read $file"
fi
done
我用$0~search替换了/search/,现在可以使用了。谢谢。请注意,您的脚本正在用字符串替换与给定RE匹配的字符串,而不是用字符串替换给定字符串。如果确实要搜索字符串,则需要使用index()、length()和substr()而不是~和sub()。如果“search”碰巧包含任何重元字符,如+、*,等等,您将看到差异。
#!/bin/bash
# Replaces a specific occurrence of a search string with a replace string
if [ $# -lt 4 ] ; then
echo -e "Wrong number of parameters."
echo -e "Usage:"
echo -e "repnthstr file search replace n"
echo -e "repnthstr fileext search replace n"
exit 1
fi
for file in $1
do
if [ -f $file -a -r $file ]; then
awk -v search=$2 -v replace=$3 -v cnt=$4 '$0 ~ search{c++;if(c==cnt){sub(search,replace);}}1' "$file" > temp && mv temp "$file"
else
echo "Error: Cannot read $file"
fi
done