문자열에서 두 개의 숫자 값을 가져 와서 변수에 할당하려고합니다 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 -Vstdin 에서 온다고 가정하면 현재 다음이 있습니다.
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. 가능한 다른 것이 있습니까?
가독성은 실제로 문제가 아니며 길이에 불과합니다.
답변
참고 gensubA는 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는 있지만 ).
답변
