我在Windows上的批处理文件中使用awk。出于某种原因,sub / gsub正在擦除匹配,而不是替换。我把头发拉过来......这是一个示例线:
awk "{ gsub(/ZSection/, "Section"); print}" temp1.txt > temp2.txt
结果:“ZSection”刚刚在temp2.txt中消失了。没有“部分”,任何地方。
我在我的机器上的其他脚本中使用sub / gsub没有问题,语法相同(我想?除非我只是盲目和/或疯狂)。
我错过了什么?是否有可能批处理文件中的其他操作与sub / gsub的功能相混淆?救命啊!
答案 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 \""的语法。这有效,但它似乎是我的脚本工作所需的一组引号。一切都在斜线......