awk 和等价物 类

awk and equivalence classes

gnu awk 支持POSIX equivalence classes吗?

是否可以像在 grep 中那样使用 awk 匹配 [[=a=]]?

$ echo ábÅ | grep [[=a=]]
ábÅ

$ echo ábÅ | grep -o [[=a=]]
á
Å

here,接近尾声:

相同字符列表的区域特定名称。名称包含在“[=”和“=]”之间。例如,名称“e”可能用于表示所有“e”、“ê”、“è”和“é”。在这种情况下,‘[[=e=]]’是匹配‘e’、‘ê’、‘é’或‘è’中任何一个的正则表达式。

这些功能在非英语地区非常有价值。

注意:gawk 用于正则表达式匹配的库函数目前只能识别 POSIX 个字符 类;他们不识别整理符号或等价物 类.

根据 GAWK User's Guide、"Caution: The library functions that gawk uses for regular expression matching currently only recognize POSIX character classes; they do not recognize collating symbols or equivalence classes."。

因此,您将不得不在正则表达式 /[aáÅ]/ 或任何您要查找的内容中写出允许的等效项。

有可识别区域设置的字符范围,但这似乎不是您要问的内容。

你会惊讶于 gawk 这些天愿意做的事情:

 echo 'eÅêéAEè' \
                 \
 | mawk 'BEGIN { FS=RS="^$"
                   ORS=  ""
   } sub(/[\n]$/,"") +\
    gsub("[ \t]+|[[=10=]0-\b\v-!-7]|"\
                 "[0-7]+","&\n")'  \
                                          \
 | gtee >( gpaste -s -d':' - | ecp >&2; )  \
                                            \ 
 | LC_ALL=C gawk -b -e '/[=[:lower:]=]|[=Å=]/'
  • e:Å:ê:é:A:E:è

     1   e
     2   Å
     3   ê
     4   é
     5   è
    

即使我强制使用 non-multibyte "C" 语言环境以及在 gawk 中使用字节模式缺陷,它也愿意在更大的 class 级别匹配它。但是,如果我只指定了斯堪的纳维亚语 A-ring.

,它就不愿意匹配 ASCII“A”