Bashの言語コードと一致する正規表現

Bashの言語コードと一致する正規表現

同様の質問がありますスタックオーバーフローしかし、bashでは動作しません。

スクリプト/変数を使用してbashと連携するには何が必要ですか?

私はISO 639-1またはISO 639-2コードについて話しています。

私のバッシュはGNU 4.3です。

例:

root@box ~/test2 # ls
eng  en-US  por pt-BR

このページの正規表現は失敗します。

root@box ~/test2 # ls | grep ^[a-z]{2}-[A-Z]{2}$
root@box ~/test2 # ls | grep ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep ^[a-z]{2}(-[A-Z]{2})*
-bash: syntax error near unexpected token `('
root@box ~/test2 # ls | grep "^[a-z]{2}(-[A-Z]{2})*"

答え1

{n}バックスラッシュがない場合は拡張正規表現の一部であるため、-Egrepフラグが必要です。ご覧のとおり、括弧と中括弧はシェルで特別な意味を持つため、正規表現を引用しようとしています。

$ ls
eng  en-US  por  pt-BR

$ printf "%s\n" * | grep -E '^[a-z]{2}-[A-Z]{2}$'
en-US
pt-BR

$ printf "%s\n" * | grep -E '^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$'
eng
en-US
por
pt-BR

または単にBashを使用してください:

$ for f in * ; do 
   [[ $f =~ ^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$ ]] && printf "%s\n" "$f" ; done
eng
en-US
por
pt-BR

[[ .. ]]テスト構造は特別です。中括弧と括弧はその中で異なる意味を持ちます。実際には正規表現は次のようになります。引用しないここで。これと同じではありません[ .. ]BashGuideの条件文ガイド)


この[a-zA-Z]{1,8}部分は最大8文字の文字列と一致し、最後の部分は*括弧内のグループを複数回繰り返すことができるため、foobar-foobar-foobar同様のものと一致します。

必要に応じて、^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,3})?$2文字または3文字と末尾の部分を含むコードのみを許可するようにパターンを変更できます。-xx


引用符が{1,8}ない場合支柱の拡張:

$ echo ^[A-Za-z]{1,8}
^[A-Za-z]1 ^[A-Za-z]8

引用符が[]ない場合ファイル名パターンマッチング(glob)...

$ touch "^a1" "^b8"
$ echo ^[A-Za-z]{1,8}
^a1 ^b8

答え2

まずregex、grepが要求するように参照を使用する必要があります。grep 'regex'

egrepその後、orを使用してgrepで拡張正規表現サポートを有効にして動作しgrep -Eます。

$ ls | egrep '^[a-z]{2}-[A-Z]{2}$'

または、古典的なgrep(デフォルトの正規表現)を使用できますが、エスケープが必要{です}

$ ls | grep '^[a-z]\{2\}-[A-Z]\{2\}$'

あなたの質問に基づいてこのデータを入手してください

$ ls
eng
en-US
main.sh
por
pt-BR

grepの両方の場合、出力は次のようになります。

en-US
pt-BR

答え3

  1. これは拡張正規表現なので、次を使用してください。-E
  2. 特殊文字を含む検索パターンを使用している場合は、それを引用してください。

grep -E "^[a-z]{2}-[A-Z]{2}$"

関連情報