문자열에서 두 개의 숫자 값을 가져와서 이를 사용하여 변수에 할당하려고 합니다 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); }'
...파이썬과 비슷하지만 특정 구문을 사용하면 awk
다른 것이 가능합니까?
가독성은 실제로 문제가 아니라 길이일 뿐입니다.
답변1
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
답변2
이는 gensub
확장 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}'
답변3
버전을 배열로 분할할 수 있습니다.
awk '{ split($2, ver, /[.a-z]/) }'
ver[1]
그런 다음 대신 을 사용 maj
하십시오 .ver[2]
min
구분 기호를 추가하면 a-z
버전 번호에서 모든 소문자가 제거됩니다. (여기에서는 숫자를 명시적으로 추출하기 때문에 다른 솔루션이 더 좋습니다.)
답변4
다른 사용자가 이 답변을 게시했으나 나중에 삭제되었습니다. 나는 이것이 유용하다고 생각합니다:
이 split()
함수를 사용하여 버전 문자열을 배열로 분할 하고 합계 대신 ver
별도로 합계에 액세스합니다 ( 또는 단순히 이러한 변수에 값을 저장합니다).ver[1]
ver[2]
maj
min
tmux -V | awk '{ split($2, ver, /[.a-z]/); print ver[1], ver[2] }'
여기서 장점은 확장이 split()
아니라는 점입니다(선택적인 네 번째 인수 는 확장임에도 불구하고).gawk
seps