次のファイルを含むディレクトリがあるとします。
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_REMATCH
bashが正規表現リテラルの結果をその変数に格納するためです。
$ 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]
。