ファイル名から特定の文字列を検索し、シェルスクリプトの変数に保存します。

ファイル名から特定の文字列を検索し、シェルスクリプトの変数に保存します。

非常に具体的な命名スキームを持つファイルがあるとしましょう。たとえば、という名前のファイルがあり、x=1,y=15,z=63.txtこのファイル名を変数に保存しましたfile。変数から文字列を検索"x="し、その後の数字を変数に保存したいと思いますxyそして江戸同様ですz

x="search x=*, $file"
y="search y=*, $file"
z="search z=*.txt $file"

シェルスクリプトに初めて触れる人として、これは明らかに偽のコマンドであり、コンパイルされませんが、これが私の目標の概要を説明してくれることを願っています。私がやりたいことに対する解決策はありますか?

答え1

注:答えはbashシェルに適用され、ファイル名にスペースなどの特殊文字が含まれていないとします。

変数にファイル名が含まれていると仮定すると、$fileまずファイルのサフィックスを削除する必要があります。

$ file=${file%.*}
$ echo $file
x=1,y=15,z=63

$fileはそれがすべてですx=1,y=15,z=63

declareこれで組み込みの機能を使用できますbash

declare ${file//,/ }

${file//,/ }すべてのカンマ文字を空白に置き換えるため、bashはこれを次のように拡張します。

declare x=1 y=15 z=63

結果:

$ declare ${file//,/ }
$ echo $x $y $z
1 15 63

答え2

正規表現と sed を使用して数値を抽出できます。


$ echo x=1,y=15,z=63  | sed 's/.*x=\([0-9]\+\).*/\1/g'
1
$ echo x=1,y=15,z=63  | sed 's/.*y=\([0-9]\+\).*/\1/g'
15
$ echo x=1,y=15,z=63  | sed 's/.*z=\([0-9]\+\).*/\1/g'
63

答え3

値が整数であると仮定すると、正規表現の一致は値を抽出するきちんとした方法になります。

これは:

file='x=1,y=15,z=63.txt'

if [[ $file =~ "x="([0-9]+)",y="([0-9]+)",z="([0-9]+) ]]; then
    x=${BASH_REMATCH[1]}
    y=${BASH_REMATCH[2]}
    z=${BASH_REMATCH[3]}
fi

declare -p x y z

出力

declare -- x="1"
declare -- y="15"
declare -- z="63"

関連情報