1

我对脚本很陌生(2 个月)并且在 awk 中使用 Ignorecase 时遇到了一个我不明白的问题。我已经有一个使用 sed 的解决方案,但我仍然想知道为什么会发生以下情况以及如何避免它。

从这条线上;

echo foo.BAZ.bar | awk 'IGNORECASE = 1;{gsub(/'.baz.'/,"'.'")};{print}'

我得到输出,

foo.BAZ.bar foo.bar

但我只希望输出foo.bar。可以通过从行中删除来避免上述行为IGNORECASE = 1;,但这意味着.BAZ.当然不会从 中删除foo.BAZ.bar。这种行为对我来说似乎很奇怪,非常不可取!

感谢您的任何输入,非常感谢:)

文斯

4

2 回答 2

0

你需要做:

echo foo.BAZ.bar | awk 'BEGIN{IGNORECASE = 1}{gsub(/[.]baz[.]/,".")}1'

;当您在语句之后放置显式IGNORECASE语句时,您的行会在任何修改之前按原样打印,因为该操作返回 true 并awk打印该行。一旦gsub得到修改行,显式print然后打印修改的行。

另外,请注意字符串保存在gsub函数中的方式。

更新:正如 Ed 在评论中所述,使用之前的解决方案将针对每一行测试 IGNORECASE 变量。把它放在 BEGIN 部​​分分配一次并将其用于整个文件。

于 2014-03-14T11:00:15.683 回答
0
kent$  echo foo.BAZ.bar|awk -v IGNORECASE=1 '{gsub(/.baz./,".")}7'      
foo.bar
于 2014-03-14T10:53:11.867 回答