Saya mencoba menarik dua nilai numerik dari string dan menetapkannya ke variabel menggunakan awk
( gawk
adalah apa yang saya gunakan khusus). Saya ingin menarik nomor versi utama dan kecil dari string versi tmux ke dalam awk
variabel, misalnya:
- masukan
tmux 2.8
:;maj == 2
danmin == 8
- masukan
tmux 1.9a
:;maj == 1
danmin == 9
- masukan
tmux 2.10
:;maj == 2
danmin == 10
Dengan asumsi input saya berasal dari tmux -V
pada stdin, saat ini saya memiliki yang berikut:
tmux -V | awk '{
maj = +gensub(/([0-9]+)\..*/, "\\1", "g", $2);
min = +gensub(/.*\.([0-9]+).*/, "\\1", "g", $2);
# ...do something with maj and min...
}'
Ini berfungsi, tetapi karena banyak pengguna tmux tahu, menggunakan if-shell
dalam .tmux.conf
file (di mana saya berharap untuk menggunakan hal ini) dapat dengan mudah mengarah ke garis yang sangat panjang dalam file konfigurasi, jadi saya bertanya-tanya apakah ada cara untuk menggabungkan kedua variabel ini tugas menjadi satu pernyataan untuk menghemat ruang ... atau cara lain untuk mendapatkan dua variabel ini dari input dan menghemat ruang.
Saya sedang memikirkan sesuatu seperti:
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
... seperti di Python, tetapi sintaks tertentu tidak ada di awk
. Apakah ada hal lain yang mungkin?
Perhatikan bahwa keterbacaan sebenarnya bukan masalah, hanya panjang.
Karena Anda menggunakan GNU awk, Anda dapat menggunakan bentuk 3-arg
match()
untuk menyimpan beberapa grup pengambilan:https://www.gnu.org/software/gawk/manual/html_node/String-Functions.html
sumber
Anda dapat membagi versi menjadi array:
lalu gunakan
ver[1]
sebagai gantimaj
,ver[2]
alih-alihmin
.Menambahkan
a-z
ke pemisah menghapus huruf kecil apa pun dari nomor versi. (Solusi lain lebih baik di sini karena mereka secara eksplisit mengekstraksi angka.)sumber
Pengguna lain memposting jawaban ini, dan kemudian dihapus. Saya pikir itu berguna:
Dengan menggunakan
split()
fungsi ini, pisahkan string versi ke dalam arrayver
, lalu aksesver[1]
danver[2]
alih - alihmaj
danmin
masing-masing (atau cukup simpan nilai dalam variabel tersebut):Nilai tambah di sini adalah bahwa
split()
itu bukangawk
ekstensi (meskipun argumen opsional keempatnyaseps
adalah).sumber
/[.a-z]/
sebagai argumen (pemisahan bidang) ketiga darisplit
fungsi string, bukan hanya"."
?