name=$(echo "$FILENAME" | grep -E '*\.(eng|por|pt-BR)\.*')
この行はなぜ動作しませんか?
もし私がするなら
echo "Test (2013).1080p.por.mkv" | grep -E "*\.(eng|por)\.*"
動作します。 「」なしで「」を使用し、スクリプトで 'を使用してみましたが、grepにパイプされていないようです。なぜかわからない。 bashを使用しています。
FILENAME="Test (2013).1080p.por.mkv"
私はちょうど.porを取得したいと思います。またはファイルの.eng
ベストアンサー1
grep
パターンに一致する(全体)行を印刷するツールです。文字列の一部を抽出することは適切ではありません(一部の実装では、grep
場合によってはこのオプションを使用または-o<n>
使用できます)。-o
ここでは以下を使用できますexpr
。
name=$(expr " $FILENAME" : '.*\.\(eng\)\.' '|' \
" $FILENAME" : '.*\.\(por\)\.' '|' \
" $FILENAME" : '.*\.\(pt-PT\)\.')
( の場合がfoo.por.eng.bar
より優先しますeng
。)por
pt-PT
いくつかのexpr
実装(例:GNU)はexpr
以下もサポートしています。
name=$(expr " $FILENAME" : '.*\.\(eng\|por\|pt-PT\)\.')
(ファイル名が2つ以上の場合、一番右側に一致する項目が返されます。)
GNUgrep
または互換製品を使用してください。
name=$(
printf '%s\n' "$FILENAME" |
grep -Po '\.\K(eng|por|pt-PT)(?=\.)' |
head -n 1
)
(最初の項目を返し、最後の項目head
に置き換えます)tail
case
または、コマンドを実行せずにシェル構成を使用できます。
case $FILENAME in
(*.por.*) name=por;;
(*.eng.*) name=eng;;
(*.pt-PT.*) name=pt-PT;;
esac
そしてbash
:
re='\.(por|eng|pt-PT)\.'
[[ $FILENAME =~ $re ]]
name=${BASH_REMATCH[1]}
(最初の発生。、に置き換えますzsh
)BASH_REMATCH
match