awk替换shell变量

9

我正在处理awk替换,但出现了问题,以下代码没有进行任何替换,只是打印输出未改变的内容。有人能看到我漏掉的部分吗?任何帮助都将不胜感激!(PS!$DOCPATH和$SITEPATH是shell变量,在我的awk设置中完全正常运行)。

awk -v docpath="$DOCPATH" -v sitepath="$SITEPATH" '{ sub( /docpath/, sitepath ) } { print }'
3个回答

15

说:

sub( /docpath/, sitepath )
< p > 使用 awk 命令时,它将替换模式 docpath,而不是变量 docpath。 < /p > < p > 请说明: < /p >
awk -v docpath="$DOCPATH" -v sitepath="$SITEPATH" '{sub(docpath, sitepath)}1' filename

这种方法完全是错误的,应该参考perreal提供的sed命令。 - BMW
1
是的,我的实际脚本要复杂一些。我还需要粘贴后缀和前缀等内容。因此,Awk很适合,但如果我的问题仅限于这个问题,我可能会选择sed解决方案。感谢您的有益反馈 :) - Dan-Simon Myrland

3

我忍不住要用sed来写这段代码:

sed 's/'"$DOCPATH"'/'"$SITEPATH"'/' input

由于原始的awk命令使用了sub()函数,因此在sed中不应添加g选项。 - BMW
1
通常情况下,如果变量($SITEPATH)包含换行符,则无法正常工作。 - Vassilis

1

/docpath/会查找字面字符串"docpath",而不是您想要的变量。只需使用sub(docpath,sitepath)

注意:如果同一行中可能有多个匹配项,则需要使用gsub而不是sub


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接