문자가 연속해서 나타나는 빈도 확인 [닫기]

문자가 연속해서 나타나는 빈도 확인 [닫기]

(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

관련 정보