awk 替换 shell 变量

Posted

技术标签:

【中文标题】awk 替换 shell 变量【英文标题】:awk substitute shell variables 【发布时间】:2014-01-04 22:41:11 【问题描述】:

我正在为 awk 替换而苦苦挣扎,由于某种原因,以下代码没有替换任何东西,它只是打印输出不变。谁能看到我在这里想念的东西?任何帮助都会非常感激! (PS!$DOCPATH 和 $SITEPATH 是 shell 变量,它们在我的 awk 设置中工作得很好)。

awk -v docpath="$DOCPATH" -v sitepath="$SITEPATH" ' sub( /docpath/, sitepath )   print '

【问题讨论】:

【参考方案1】:

说:

sub( /docpath/, sitepath )

导致awk 替换模式docpath,而不是变量docpath

你需要说:

awk -v docpath="$DOCPATH" -v sitepath="$SITEPATH" 'sub(docpath, sitepath)1' filename

【讨论】:

这种方式完全错误,应该参考perreal提供的sed命令。 是的,我的实际脚本要复杂一些。我还需要粘贴后缀和前缀的东西。 awk 因此效果很好,但如果我的问题仅与这个问题有关,我可能会选择 sed 解决方案。感谢您提供有用的反馈:)【参考方案2】:

没办法用 sed 写这个:

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

【讨论】:

由于原来的 awk 命令使用了 sub(),所以不应该在 sed 中添加 g 选项。 一般来说,如果变量 ($SITEPATH) 包含换行符,这将不起作用。【参考方案3】:

/docpath/ 将搜索文字字符串“docpath”,而不是您想要的变量。只需使用sub(docpath, sitepath)

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

【讨论】:

以上是关于awk 替换 shell 变量的主要内容,如果未能解决你的问题,请参考以下文章

shell中按照指定字符截取两边的数据,放到变量里

如何在sed中使用变量

如何将awk中一个变量的值传递给shell中的变量

awk引用shell中变量的几种方法

awk的结果怎么赋值给Shell变量

awk中使用shell变量