Bash

僅匹配正則表達式中的 ASCII 字母,忽略變音符號

  • September 5, 2017

我在我的 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

引用自:https://unix.stackexchange.com/questions/390454