입력 문자열을 받아들이고 다음과 같이 확장하는 쉘 스크립트를 만드는 데 도움이 필요합니다.
입력하다 => 산출
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보다 큰 숫자에는 작동하지 않습니다. 문자와 숫자를 구별하려면 더 큰 논리를 구현해야 합니다.