用于扩展输入字符串的 shell 脚本

用于扩展输入字符串的 shell 脚本

我需要帮助创建一个 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 的数字。人们必须实现一些更大的逻辑来区分字母和数字。

相关内容