(Bash에서) 문자의 연속 발생을 확인하는 방법이 필요하지만, 문자를 두 번째 변수로 처리하기 전에 발생 횟수를 제한하여 더 큰 세트가 먼저 나타나도록 할 수도 있어야 합니다. 예를 들어, 이진 문자가 있고 다음을 수행할 수 있는 스크립트가 필요하다고 가정해 보겠습니다.
01111100
다음과 같이 보고됨
03200
또는
01001111
~처럼
010031
또는
01011001
~처럼
0102001
제발아니요, bash 쉘에 들어갈 수 있는 유일한 방법이 아니라면 말이죠.
답변1
Perl이 마음에 들지 않으면 할 수 있습니다.
1 시퀀스의 단일 0 또는 1~3 인스턴스와 일치합니다.
0을 자신에게 매핑하고 시퀀스를 길이에 매핑합니다.
예를 들어
perl -lne '@runs = $_ =~ /(0|1{1,3})/g; print map { $_==0 ? $_ : length $_ } @runs'
제공된 문자열을 사용하여 테스트합니다.
cat << EOF | \
perl -lne '@runs = $_ =~ /(0|1{1,3})/g; print map { $_==0 ? $_ : length $_ } @runs'
01111100
01001111
01011001
EOF
산출
03200
010031
0102001
Perl이 옵션이 아닌 경우 grep 및 bash 배열 사용과 같은 다른 정규식 도구를 사용하여 동일한 작업을 수행할 수 있습니다.
mapfile -t runs < <(echo '01111100' | grep -Eo '0|1{1,3}')
그 다음에
for r in "${runs[@]}"; do ((r == 0)) && printf '0' || printf '%d' "${#r}"; done; printf '\n'
03200