同様の質問がありますスタックオーバーフローしかし、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}
バックスラッシュがない場合は拡張正規表現の一部であるため、-E
grepフラグが必要です。ご覧のとおり、括弧と中括弧はシェルで特別な意味を持つため、正規表現を引用しようとしています。
$ 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
- これは拡張正規表現なので、次を使用してください。
-E
- 特殊文字を含む検索パターンを使用している場合は、それを引用してください。
grep -E "^[a-z]{2}-[A-Z]{2}$"