awk中的Ignorecase创建意外输出

awk中的Ignorecase创建意外输出,awk,gsub,ignore-case,Awk,Gsub,Ignore Case,我对脚本编写非常陌生(2个月),在awk中使用Ignorecase时遇到了一个问题,我不理解。我已经有了一个使用sed的解决方案,但我仍然想知道为什么会发生下面的情况,以及如何避免它 从这条线 echo foo.BAZ.bar | awk'IGNORECASE=1;{gsub(/'.baz./,“'.'”)};{print}' 我得到输出 foo.BAZ.bar foo.bar 但是我只希望输出foo.bar。通过删除IGNORECASE=1,可以避免上述行为从行中删除,但这意味着.BAZ.当然

我对脚本编写非常陌生(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
中删除。这种行为对我来说似乎很奇怪,非常不受欢迎

感谢您的任何意见(非常感谢:)

文斯

你需要做:

echo foo.BAZ.bar | awk 'BEGIN{IGNORECASE = 1}{gsub(/[.]baz[.]/,".")}1'
当你把一个显式的
IGNORECASE
语句之后,您的行会像任何修改之前一样被打印,因为操作返回true并且
awk
打印该行。一旦
gsub
修改了行,显式的
print
就会打印修改后的行

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


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

谢谢,杰,这是我需要的信息。我明白为什么会这样;现在导致这种行为:)这是错误的方法。您不想测试为输入文件中的每一行的变量指定1的结果。请参阅@Kent的解决方案或将作业移至开始部分。此外,gsub()中的第一个参数不是字符串,而是regexp,因此
,例如,它并不表示字符
,而是表示任何单个字符。始终注意字符串和regexp之间的区别很重要,这样它就不会在最不经意的时候咬到你。感谢@EdMorton一如既往的反馈。我已更新到解决方案。
echo foo.BAZ.bar | awk 'BEGIN{IGNORECASE = 1}{gsub(/[.]baz[.]/,".")}1'