私は次の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