문자열에서 두 개의 숫자 값을 가져 와서 변수에 할당하려고합니다 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
쉽게 발생할 수 있습니다 (I이 물건을 사용할 수 있도록 노력하겠습니다) 파일 정말 이 두 변수를 결합 할 수있는 방법이 있는지 궁금 해요, 그래서 config 파일에서 긴 줄 공간을 절약하기 위해 하나의 문장으로 할당 또는 입력과 공간 에서이 두 변수를 수집하는 다른 방법.
나는 다음과 같은 것을 생각하고있다 :
awk '{ maj, min = +gensub(/([0-9]+)\.([0-9]+).*/, "\\1 \\2", "g", $2); }'
… 파이썬과 비슷하지만 특정 구문은에 존재하지 않습니다 awk
. 가능한 다른 것이 있습니까?
가독성은 실제로 문제가 아니며 길이에 불과합니다.
답변
참고 gensub
A는 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}'
답변
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
답변
버전을 배열로 분할 할 수 있습니다.
awk '{ split($2, ver, /[.a-z]/) }'
다음 사용하는 ver[1]
대신 maj
, ver[2]
대신 min
.
a-z
구분 기호에 추가 하면 버전 번호에서 소문자가 제거됩니다. (다른 솔루션은 숫자를 명시 적으로 추출하기 때문에 여기서 더 좋습니다.)
답변
다른 사용자가이 답변을 게시했으며 나중에 삭제되었습니다. 나는 그것이 유용하다고 생각했다.
이 split()
함수를 사용하여 버전 문자열을 배열로 분할 ver
한 다음 ver[1]
and ver[2]
가 아닌 maj
및 min
에 각각 액세스합니다 (또는 단순히 해당 변수에 값을 저장).
tmux -V | awk '{ split($2, ver, /[.a-z]/); print ver[1], ver[2] }'
여기에 플러스 split()
는 gawk
확장 이 아닙니다 (선택적 인 네 번째 인수 seps
는 있지만 ).