Я пытаюсь извлечь два числовых значения из строки и назначить их переменным с помощью 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
файле (где я надеюсь использовать этот материал) может легко привести к очень длинным строкам в файле конфигурации, поэтому мне интересно, есть ли способ объединить эти две переменные присваивания в одном операторе для экономии места ... или любой другой способ извлечь эти две переменные из ввода и сэкономить место.
Я думаю о чем-то вроде:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... вроде как в Python, но этот конкретный синтаксис не существует в awk
. Есть ли что-нибудь еще, что возможно?
Обратите внимание, что читаемость на самом деле не проблема, просто длина.
Поскольку вы используете GNU awk, вы можете использовать 3-аргументную форму
match()
для хранения нескольких групп захвата:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
источник
Вы можете разделить версию на массив:
тогда используйте
ver[1]
вместоmaj
,ver[2]
вместоmin
.Добавление
a-z
в разделитель удаляет любую строчную букву из номера версии. (Другие решения здесь лучше, так как они явно извлекают числа.)источник
Другой пользователь опубликовал этот ответ, и позже он был удален. Я думал, что это было полезно:
Используя
split()
функцию, разбейте строку версии на массивver
, затем получите доступver[1]
иver[2]
вместоmaj
иmin
, соответственно (или просто сохраните значения в этих переменных):Плюс здесь в том, что
split()
это неgawk
расширение (хотя его необязательный четвертый аргументseps
есть).источник
/[.a-z]/
в качестве третьего (разделение полей) аргументsplit
строковой функции, а не просто"."
?