入力文字列を受け入れ、次のように拡張するシェルスクリプトを作成するのに役立ちます。
入力する => 出力
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
どちらの実装も、1桁の文字列と1桁の数だけを許可するという点で欠陥があります。
以下は、その制限を削除します。
$ 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より大きい数字では機能しません。文字と数字を区別するには、より大きなロジックを実装する必要があります。