我在 bash 脚本中使用正则表达式,例如
REGEX="^[a-zA-Z0-9\-]+$"
我想过滤掉所有非标准单词,特别是包含德语特殊字符的单词äöüÄÖÜß
但根据本手册如果您将 LOCALE 设置为德语,则正则表达式a-z
也包含ö
我该如何解决这个问题?
我已经尝试将脚本开头的区域设置设置为英语:
#!/bin/bash
LANG=en_US.utf8
LANGUAGE=en_US.utf8
LC_ALL=en_US.utf8
export LANG
export LANGUAGE
export LC_ALL
但没有效果。
我不想执行此解决方法并预先替换特殊字符:
tr _ -|tr . -|tr " " -|tr '[:upper:]' '[:lower:]'|sed 's/ä/ae/;s/ö/oe/;s/ü/ue/;s/ß/ss/g')
我宁愿学习正确的方法。
答案1
使用:
REGEXP='^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$'
选择您想要的字符。匹配的内容[a-z]
仅保证位于[abcdefghijkmnopqrstuvwxyz]
C/POSIX 语言环境中。
(我假设您不希望包含反斜杠,但这\
是转义的错误尝试-
)。
^[a-zA-Z0-9-]+$
另一种选择是在使用评估扩展正则表达式(或)的工具之前将语言环境修复为 C ^[[:alnum:]-]+$
,例如:
LC_ALL=C grep -Ee "$REGEXP"
这在这种情况下是有效的,但在像REGEXP='[A-Z]'
匹配正则表达式的数据位于 BIG5-HKSCS 或 GB18030 等字符集中(以及使用相同字符的语言环境中)的情况下则不然,其中许多字符具有包含相同编码的编码作为那些A-Z
。
[A-Z]
匹配Á
(U+00C1,在 BIG5-HKSCS 中编码为 0x88 0x57(其中 0x57 也是W
))的示例:
$ LC_ALL=zh_HK.big5hkscs REGEXP='[A-Z]' bash -c 'printf "\uc1\n" |
LC_ALL=C grep -qe "$REGEXP" && echo match'
match