如何转义 awk 中的句点(点)字符?

How to escape the period (dot) character in awk?

我在 Windows 8.1(来自 GnuWin32)上使用 gawk

如何转义句点(“.”)字符?

我试过用“\”。和 "\x2e" 但它不起作用

我的输入文件(z.txt)是这样的:

fox.doc
bear.jpg
abcjpg

我正在尝试使用此脚本 (z.awk) 查找 .jpg 文件:

  { printf [=11=]; if (match([=11=], /\x2ejpe?g$/)) printf " - Jpeg image"; print "" }

我运行这个脚本来自一个批处理文件(z.bat):

cat z.txt | gawk -f z.awk

我用的是“\”没关系。或“\x2e”或“.”,它仍然会匹配任何字符。我得到的输出是

fox.doc
bear.jpg - Jpeg image
abcjpg - Jpeg image

在输出中,最后一行应该是:

abcjpg

我已将脚本上传到此处 - https://github.com/FrostShock/WinScripts/tree/main/ZZZ

对于 GNU awk,如果您希望按字面解释转义序列,则必须使用兼容模式 (-c):

$ man awk
...
In  compatibility  mode,  the  characters represented by octal and
hexadecimal escape sequences are treated literally when used in regular
expression constants.  Thus, /ab/ is equivalent to /a\*b/.

但我很惊讶 \. 没有按预期工作。在你没有展示的东西中一定有其他事情发生了。尝试,也许:

awk '/\.jpe?g$/ {$(NF+1) = " - Jpeg image"} {print}'

演示:

$ printf '%s\n' "foo.doc" "bear.jpg" "abcjpg.txt" | \
  awk '/\.jpe?g$/ {$(NF+1) = " - Jpeg image"} {print}'
abcjpg.txt
bear.jpg  - Jpeg image
foo.doc