Bash
僅匹配正則表達式中的 ASCII 字母,忽略變音符號
我在我的 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')
我寧願學習正確的方法。
採用:
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