为什么awk sub / gsub只是擦除匹配?

时间:2013-07-16 21:20:50

标签: awk

我在Windows上的批处理文件中使用awk。出于某种原因,sub / gsub正在擦除匹配,而不是替换。我把头发拉过来......这是一个示例线:

awk "{ gsub(/ZSection/, "Section"); print}" temp1.txt > temp2.txt

结果:“ZSection”刚刚在temp2.​​txt中消失了。没有“部分”,任何地方。

我在我的机器上的其他脚本中使用sub / gsub没有问题,语法相同(我想?除非我只是盲目和/或疯狂)。

我错过了什么?是否有可能批处理文件中的其他操作与sub / gsub的功能相混淆?救命啊!

3 个答案:

答案 0 :(得分:8)

这是你的代码,但不起作用。

awk "{ gsub(/ZSection/, "Section"); print}" temp1.txt

这是正确的代码:

awk '{ gsub(/ZSection/, "Section"); print}' temp1.txt
你能找到差异吗?

如果我们进一步深入,您的匹配模式将被删除。因为变量 Section未设置任何值。是的,这里awk认为Section是一个变量。如果你想证明它:

awk "{Section=555; gsub(/ZSection/, "Section"); print}" temp1.txt
awk "{Section=\"hello\"; gsub(/ZSection/, "Section"); print}" temp1.txt

检查上面两行的输出,你会看到。

我的答案的第二部分仅仅是为了解释为什么删除了比赛。但是我们应该正确引用命令。

答案 1 :(得分:7)

您的问题似乎与脚本和替换字符串的引号相同。用单引号替换外部对:

awk '{ gsub(/ZSection/, "Section"); print}' temp1.txt > temp2.txt

答案 2 :(得分:1)

awk "{ gsub(/ZSection/, \"Section\"); print}" temp1.txt > temp2.txt

在Windows 7中找到了关于awk引用的另一个溢出问题(感谢其他海报提及引号,尽管他们的解决方案并不起作用)。那里的解决方案提出了类似于"" Section \""的语法。这有效,但它似乎是我的脚本工作所需的一组引号。一切都在斜线......