Bashで部分文字列を抽出する

someletters_12345_moreleters.ext」という形式のファイル名があった場合、5桁の数字を抽出して変数に入れたいと思います。

要点を強調すると、x個の文字からなるファイル名があり、そのファイル名の両側にアンダースコア1個で囲まれた5桁の数字があり、さらにx個の文字からなるセットがあります。 5桁の数字を取り出して、それを変数に入れたいのです。

これを実現するためのさまざまな方法にとても興味があります。

ソリューション

カット]1を使います。

echo 'someletters_12345_moreleters.ext' | cut -d'_' -f 2

より汎用的に。

INPUT='someletters_12345_moreleters.ext'
SUBSTRING=$(echo $INPUT| cut -d'_' -f 2)
echo $SUBSTRING
解説 (7)

ファイル名のどこにでも番号を入れることができる汎用的なソリューションで、そのような配列の最初のものを使用します。

number=$(echo $filename | egrep -o '[[:digit:]]{5}' | head -n1)

変数の一部を正確に抽出する別の方法。

number=${filename:offset:length}

ファイル名が常に stuff_digits_... という形式である場合,awk を使うことができます。

number=$(echo $filename | awk -F _ '{ print $2 }')

さらに、数字以外のすべてのものを削除する別の解決策として

number=$(echo $filename | tr -cd '[[:digit:]]')
解説 (1)

また、bashに組み込まれた「expr」コマンドもあります。

INPUT="someletters_12345_moreleters.ext"  
SUBSTRING=`expr match "$INPUT" '.*_\([[:digit:]]*\)_.*' `  
echo $SUBSTRING
解説 (2)