gawk正则表达没有按预期工作

时间:2016-01-11 14:25:01

标签: regex awk non-ascii-characters

我在awk脚本中有一个功能,主要是工作,但如果德国“umlaute”(äöü)通过则不会。

function sanitizeIdentifier(str){
  debug( "san IN:" str)
  gsub(/[^_a-zA-Z0-9]/, "_", str)
  debug( "san OUT:" str)
  return str
}

输出:

san IN:(Vorhalt für Start/Stopp) 
san OUT:_Vorhalt_für_Start_Stopp__

我如何匹配变音符号或更好的为什么变音符号与表达式不匹配?

我的awk脚本是unicode(没有BOM的utf8),输入文件未知。 将它们转换为unicode也无济于事。

显式替换如gsub(/ä/, "ae", str)仅在输入文件是unicode时才有效(这很明显)。

使用

gsub(/[^_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]/, "_", str)

替换出现但如果输入文件是Utf8,则它们被两个下划线替换。 整个行为似乎有点奇怪。

我在Windows上运行GNU Awk 3.1.6(来自gnuwin32)

1 个答案:

答案 0 :(得分:2)

带有变音符号的字符超出了括号表达式中的范围,因此不匹配。 [:alpha:][:alnum:]等字符类应尊重语言环境设置,因此我建议使用它们:

gsub(/[^_[:alnum:]]/, "_", str)

使用LC_ALL=C运行应该意味着替换了变音符号。您可能还想通过添加第二个替换来删除重复的_

gsub(/_+/, "_", str)