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

标签 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)

最佳答案

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

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

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

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

关于regex - gawk 正则表达式没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34723833/

相关文章:

Linux/Unix bash 基本脚本 awk/sed

c - putc() 在 c 中返回什么?

.net - 正则表达式仅返回一个匹配项

php - 密码验证php正则表达式

awk - Grep 来自大文件的多个输入,但每个输入仅第一次出现

bash - 如何让带重音的字母在 bash 上实际工作?

elasticsearch - 使用 haystack 忽略 Elasticsearch 中的重音

python 正则表达式: expression to match number and letters

javascript - 在 JSON 中指定正则表达式字符串,在 JavaScript 和 PHP 中使用它

bash - 使用值提取所需的列