小さなスクリプトがあります。
#!/bin/bash
# test for regular expressions to match...
DIR="/search/path/"
NAME="FOO[0-9][0-9]_<bar|dog|cat>"
for FILE in `find ${DIR} -maxdepth 1 -type f -name "*\.[dD][oO][cC]"`
do
BASENAME=`basename ${FILE}`
FILENAME="${BASENAME%.*}"
if [[ "${FILENAME}" == ${NAME} ]]
then
echo "Found $FILENAME"
else
echo "$FILENAME not matching..!"
fi
done
このスクリプトでは、、、またはFOO[0-9[0-9]_
で始まるすべてのファイルを一致させようとします。しかし、またはなどの他のものがある場合は、bar
dog
cat
bog
cog
car
いいえマッチ。
これは[a-z][a-z][a-z]
一致します...
私は同様のことを試しました。
NAME="FOO[0-9][0-9]_(bar|dog|cat)"
or
NAME="FOO[0-9][0-9]_bar|dog|cat"
or
NAME="FOO[0-9][0-9]_[bar|dog|cat]"
or
NAME="FOO[0-9][0-9]_'bar|dog|cat'"
ただし、正規表現に関するドキュメントでは正確な一致に関する内容が見つかりません。
私が使用する基本スクリプトははるかに複雑で、さまざまなサブプロセスがかかっているので、1行に入力する必要があります。
これはまだ可能です…?
ベストアンサー1
文字列一致のみを使用するには、次のものを使用する必要があります=~
(拡張正規表現一致とともに):
if [[ "${FILENAME}" =~ "FOO[0-9][0-9]_(bar|dog|cat)" ]]
または
NAME="FOO[0-9][0-9]_(bar|dog|cat)"
if [[ "${FILENAME}" =~ ${NAME} ]]
元のバージョンと一致するようにします。
==
常にワイルドカードの一致(またはワイルドカードが無効になっている場合は正確な一致)であり、正規表現では使用できません。
または、GNUを使用すると想定してスクリプトをさらに変更できる場合は、次のようにfind
フィルタリングできますfind
。
find ${DIR} -maxdepth 1 -type f -regextype posix-extended -regex ".*/FOO[0-9][0-9]_(bar|dog|cat)\.[Dd][Oo][Cc]"
(拡張正規表現を使用するように-regextype posix-extended
指示すると、find
正規表現自体はファイル名だけでなくフルパスと一致する.*/
ためで始まります。)-regex