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