我在 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)
最佳答案
带有变音符号的字符超出了括号表达式的范围,因此不匹配。 [:alpha:]
或 [:alnum:]
等字符类应尊重区域设置,因此我建议改用它们:
gsub(/[^_[:alnum:]]/, "_", str)
使用LC_ALL=C
运行应该意味着带有变音符号的字符被替换。您可能还想通过添加第二个替换来删除重复的 _
:
gsub(/_+/, "_", str)
关于regex - gawk 正则表达式没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34723833/