文字列から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
現在は次のようになります。
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
(私はこれを使いたかった)簡単に結果をもたらすことができます。本物構成ファイルの行がかなり長いため、スペースを節約するためにこれら2つの変数割り当てを1つのステートメントに結合する方法があるかどうか疑問に思います。あるいは、入力からこれら2つの変数を収集し、スペースを節約する別の方法があるかどうか疑問に思います。
私は次のことを考えています:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... Pythonに似ていますが、特定の構文を使用するとawk
他のものは可能ですか?
読みやすさは実際には問題ではなく、長さだけです。
答え1
GNU awkを使用しているので、3-arg形式を使用してmatch()
複数のキャプチャグループを保存できます。
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
答え2
これは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}'
答え3
バージョンを配列に分割できます。
awk '{ split($2, ver, /[.a-z]/) }'
ver[1]
次に、代わりにを使用しmaj
てください。ver[2]
min
区切り文字を追加すると、a-z
バージョン番号からすべての小文字が削除されます。 (ここでは数値を明示的に抽出するので、他の解決策がより優れています。)
答え4
他のユーザーがこの回答を投稿しましたが、後で削除されました。私はこれが役に立つと思います:
このsplit()
関数を使用してバージョン文字列を配列に分割し、合計ではなく別々にver
合計にアクセスします(または単にこれらの変数に値を格納します)。ver[1]
ver[2]
maj
min
tmux -V | awk '{ split($2, ver, /[.a-z]/); print ver[1], ver[2] }'
ここでの利点は拡張ではsplit()
ないことです(オプションの4番目の引数は拡張ですが)。gawk
seps