입력 문자열 확장을 위한 쉘 스크립트

입력 문자열 확장을 위한 쉘 스크립트

입력 문자열을 받아들이고 다음과 같이 확장하는 쉘 스크립트를 만드는 데 도움이 필요합니다.

입력하다 => 산출

A2B3C4 => AABBBCCCC

답변1

$ perl -e 'my @F=split //, shift;
           for my $i (0..@F) { print $F[$i] x $F[++$i]};
           print "\n"' A2B3C4
AABBBCCCC

@F이렇게 하면 각 단일 문자가 배열( )의 요소가 되도록 입력이 분할됩니다 . 그런 다음 Perl의 문자열 곱셈 연산자( x)를 사용하여 각 짝수 요소(0에서 시작)를 다음 홀수 요소와 동일한 횟수만큼 인쇄합니다.

또는 명령줄 대신 표준 입력에서 입력을 받으려면 다음을 수행하십시오.

$ echo $'A2B3C4\nE5F2G7' | perl -ne 'my @F=split //;
    for my $i (0..@F) { print $F[$i] x $F[++$i]};
    print "\n"' 
AABBBCCCC
EEEEEFFGGGGGGG

두 구현 모두 한 자리 문자열과 한 자리 개수만 허용한다는 점에서 결함이 있습니다.

다음은 해당 제한을 제거합니다.

$ echo A12B3CZ4 | perl -ne '
    # insert a space between numbers and alphabetic characters.
    s/([[:alpha:]])(\d)/$1 $2/g;
    s/(\d)([[:alpha:]])/$1 $2/g;
    # split on spaces
    @F = split / /;

    for my $i (0..@F) { print $F[$i] x $F[++$i]};
    print "\n"'
AAAAAAAAAAAABBBCZCZCZCZ

답변2

Perl을 사용하면 다음과 같이 만들 수 있습니다.

  echo a2b3c4 |
  perl -pe 's/(\D)(\d+)/$1x$2/ge'

 aabbbcccc

답변3

간단한 셸 구현:

#!/usr/bin/env bash

char=""
count=""

echo "$1" | while read -n1 -r c; do
    if [ "$char" = "" ]
    then
        char="$c"
        continue
    fi

    if [ "$count" = "" ]
    then
        count="$c"

    for i in $(seq 1 "$count")
    do
        printf "%s" "$char"
    done

    char=""
    count=""

    continue
    fi
done

printf "\n"

예:

$ ./transform.sh A2B3C4D0E1
AABBBCCCCE

그러나 9보다 큰 숫자에는 작동하지 않습니다. 문자와 숫자를 구별하려면 더 큰 논리를 구현해야 합니다.

관련 정보