「*」ワイルドカードに一致するファイル名のサブストリングをどのように取得しますか?

「*」ワイルドカードに一致するファイル名のサブストリングをどのように取得しますか?

次のファイルを含むディレクトリがあるとします。

touch doc-mike.txt doc-jane.txt doc-susan.txt

次の構造を使用して、スクリプト内のこれらのファイルに対して特定のタスクを実行できます。

for fname in doc-*.txt; do
    echo input: ${fname}
done

ただし、ワイルドカードに一致するファイル名の部分文字列を取得するには、いくつかの難しいプロセスが必要です。

for fname in doc-*.txt; do
    wildcard=${fname#doc-}
    wildcard=${wildcard%.txt}

    echo input: ${fname} output: output-${wildcard}.results
done

これは働きます:

input: doc-jane.txt output: output-jane.results
input: doc-mike.txt output: output-mike.results
input: doc-susan.txt output: output-susan.results

"*"しかし、globワイルドカードと一致する部分文字列を取得するためのより良い/簡単な方法が必要だと思います。

ベストアンサー1

私が考えることができる最も近いのは、BASH_REMATCHbashが正規表現リテラルの結果をその変数に格納するためです。

$ for fname in doc-*.txt; do 
    [[ $fname =~ doc-(.*).txt ]];
    echo "input: ${fname} output: output-${BASH_REMATCH[1]}.results";
done
input: doc-jane.txt output: output-jane.results
input: doc-mike.txt output: output-mike.results
input: doc-susan.txt output: output-susan.results

(.*)正規表現の最初のグループと同様にBASH_REMATCH[1]

おすすめ記事