我需要帮助创建一个 shell 脚本,该脚本将接受输入字符串并展开如下:
输入 => 输出
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
简单的 shell 实现:
#!/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 的数字。人们必须实现一些更大的逻辑来区分字母和数字。