入力文字列を拡張するためのシェルスクリプト

入力文字列を拡張するためのシェルスクリプト

入力文字列を受け入れ、次のように拡張するシェルスクリプトを作成するのに役立ちます。

入力する => 出力

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より大きい数字では機能しません。文字と数字を区別するには、より大きなロジックを実装する必要があります。

関連情報