Próbuję wyciągnąć dwie wartości liczbowe z ciągu i przypisać je do zmiennych za pomocą awk
( gawk
właśnie tego używam). Chcę wyciągnąć główne i drobne numery wersji z łańcucha wersji tmux do awk
zmiennych, np .:
- wkład
tmux 2.8
:;maj == 2
imin == 8
- wkład
tmux 1.9a
:;maj == 1
imin == 9
- wkład
tmux 2.10
:;maj == 2
imin == 10
Zakładając, że mój wkład pochodzi ze tmux -V
standardowego wejścia, obecnie mam następujące elementy:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
Działa to, ale jak wie wielu użytkowników tmux, użycie if-shell
w .tmux.conf
pliku (gdzie mam nadzieję użyć tych rzeczy) może łatwo prowadzić do naprawdę długich linii w pliku konfiguracyjnym, więc zastanawiam się, czy istnieje sposób na połączenie tych dwóch zmiennych przypisania do jednej instrukcji, aby zaoszczędzić miejsce ... lub w jakikolwiek inny sposób uzyskać te dwie zmienne z danych wejściowych i zaoszczędzić miejsce.
Mam na myśli coś takiego:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... jak w Pythonie, ale ta szczególna składnia nie istnieje awk
. Czy jest coś jeszcze, co jest możliwe?
Pamiętaj, że czytelność nie jest tak naprawdę problemem, tylko długość.
Ponieważ używasz GNU awk, możesz użyć 3-argumentowej formy
match()
do przechowywania wielu grup przechwytywania:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
źródło
Możesz podzielić wersję na tablicę:
następnie użyj
ver[1]
zamiastmaj
,ver[2]
zamiastmin
.Dodanie
a-z
do separatora usuwa wszystkie małe litery z numeru wersji. (Inne rozwiązania są tutaj lepsze, ponieważ wyraźnie wydobywają liczby).źródło
Inny użytkownik opublikował tę odpowiedź, która została później usunięta. Myślałem, że to się przyda:
Korzystanie z
split()
funkcji, podzielić ciąg wersji na tablicęver
, a następnie dostępver[1]
iver[2]
zamiastmaj
imin
, odpowiednio, (lub po prostu przechowywać wartości w tych zmiennych):Plusem jest to, że
split()
nie jest togawk
rozszerzenie (choć opcjonalny czwarty argumentseps
to).źródło
/[.a-z]/
trzeciego argumentu (rozdzielającego pola)split
funkcji łańcuchowej zamiast po prostu"."
?