分音符を無視し、正規表現でASCII文字のみを一致させます。

分音符を無視し、正規表現で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')

むしろ正しい方法を学びたいです。

ベストアンサー1

使用:

REGEXP='^[abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0-9-]+$'

好きなキャラクターを選んでください。一致するコンテンツはC / POSIXロケール[a-z]でのみ保証されます。[abcdefghijkmnopqrstuvwxyz]

(バックスラッシュを含めたくないと仮定しますが、これは\エスケープに対する悪い試みです-。)

^[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

おすすめ記事