3

我在 Windows 上的批处理文件中使用 awk。出于某种原因 sub/gsub 正在删除匹配项,而不是替换。我正在为此拉头发……这是一条示例线:

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

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

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

我错过了什么?批处理文件中的其他一些操作是否可能与 sub/gsub 的功能有关?帮助!

4

3 回答 3

9

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

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

这是正确的代码:

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

你能找到区别吗?

如果我们再深入一点,您的匹配模式就会被删除。因为变量 Section没有设置任何值。是的,这里 awk 认为 theSection是一个变量。如果你想证明:

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

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

我的回答的第二部分只是为了解释为什么匹配被删除。但是,我们应该正确引用该命令。

于 2013-07-16T21:26:35.757 回答
7

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

awk '{ gsub(/ZSection/, "Section"); print}' temp1.txt > temp2.txt
于 2013-07-16T21:25:50.020 回答
1
awk "{ gsub(/ZSection/, \"Section\"); print}" temp1.txt > temp2.txt

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

于 2013-07-17T14:23:32.643 回答