文字列から2つの数値を取得し、awk
を使用して変数に割り当てようとしています(gawk
は特に使用しているものです)。 tmuxのバージョン文字列からメジャーバージョン番号とマイナーバージョン番号をawk
変数に取り出したいのですが、例:
tmux 2.8
; maj == 2
およびmin == 8
tmux 1.9a
; maj == 1
およびmin == 9
tmux 2.10
; maj == 2
およびmin == 10
私の入力がtmux -V
stdinで、私は現在次のものを持っています:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
これは機能しますが、tmuxの多くのユーザーが知っているように、if-Shell
の中に .tmux.conf
ファイル(このようなものを使用したい場合)は、設定ファイルでreally長い行に簡単につながる可能性があるため、これらの2つの変数の割り当てを1つのステートメントに結合する方法があるかどうか疑問に思っています。スペースを節約...または、入力からこれら2つの変数を収集してスペースを節約するその他の方法。
私は次のようなことを考えています:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... Pythonのようなものですが、その特定の構文はawk
には存在しません。他に可能なことはありますか?
読みやすさは本当に問題ではなく、長さだけに注意してください。
gensub
はgawk
拡張機能であり、他のawk
実装では機能しないことに注意してください。また、+
単項演算子は、すべてのawk
実装で数値変換を強制しないため、+ 0
の方が移植性が高いことに注意してください。
ここであなたがすることができます:
tmux -V | awk -F '[ .]' '{maj = $2+0; min = $3+0; print maj, min}'
GNU awk
拡張機能を使用してもかまわない場合は、次のようにすることもできます。
tmux -V | awk -v FPAT='[0-9]+' '{maj = $1; min = $2; print maj, min}'
GNU awkを使用しているため、match()
の3引数形式を使用して、複数のキャプチャグループを格納できます。
awk '
match($0, /([0-9]+)\.([0-9]+)/, m) {maj=m[1]; min=m[2]; print maj, min}
' <<END
tmux 2.8
tmux 1.9a
tmux 2.10
END
2 8
1 9
2 10
https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
バージョンを配列に分割できます:
awk '{ split($2, ver, /[.a-z]/) }'
次に、maj
の代わりにver[1]
を使用し、min
の代わりにver[2]
を使用します。
セパレータにa-z
を追加すると、バージョン番号から小文字が削除されます。 (他のソリューションは明示的に数値を抽出するため、ここではより優れています。)
別のユーザーがこの回答を投稿しましたが、後で削除されました。私はそれが便利だと思いました:
split()
関数を使用して、バージョン文字列を配列ver
に分割し、それぞれmaj
およびmin
ではなくver[1]
およびver[2]
にアクセスします(または単にこれらの変数に値を格納します):
tmux -V | awk '{ split($2, ver, /[.a-z]/); print ver[1], ver[2] }'
ここでのプラスは、split()
がgawk
拡張ではないことです(オプションの4番目の引数seps
はそうです)。