我正在尝试从字符串中提取两个数值并将它们分配给使用的变量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
文件中使用(我希望在其中使用这些东西)很容易导致配置文件中的行很长,所以我想知道是否有办法将这两个变量结合起来分配到一个语句中以节省空间......或任何其他方式从输入中收集这两个变量并节省空间。
我在想类似的东西:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
...有点像 Python 中的,但特定的语法在awk
. 还有什么可能的吗?
请注意,可读性并不是真正的问题,只是长度。
由于您使用的是 GNU awk,因此您可以使用 3-arg 形式
match()
来存储多个捕获组:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
请注意,这
gensub
是一个gawk
扩展,它不适用于任何其他awk
实现。另请注意,+
一元运算符不会在所有awk
实现中强制进行数字转换,使用+ 0
更便携。在这里你可以这样做:
如果你不介意使用 GNU
awk
扩展,你也可以这样做:您可以将版本拆分为一个数组:
然后使用
ver[1]
代替maj
,ver[2]
而不是min
。添加
a-z
到分隔符会删除版本号中的所有小写字母。(其他解决方案在这里更好,因为它们明确地提取数字。)另一个用户发布了这个答案,后来被删除了。我认为它很有用:
使用该
split()
函数,将版本字符串拆分为一个数组ver
,然后分别访问ver[1]
和ver[2]
而不是maj
和min
(或简单地将值存储在这些变量中):这里的优点是它
split()
不是gawk
扩展(尽管它的可选第四个参数seps
是)。