文字列の2つの単語を2つの変数にコピーする

文字列の2つの単語を2つの変数にコピーする

通常、「something、numColor(number)」など、文字列から$ colorと$ number変数を取得したいと思います。色はW、U、B、R、Gです。色がない場合、カンマの前の文字列にlandまたはLという単語がない場合、変数の色はCでなければなりません。色が2つ以上の場合、$ color変数はMでなければなりません。以下は、文字列の外観と変数が何であるかの例です。

  • マジック、R(1) $color=R, $number=1
  • クリーチャー~野獣 5/3、4G (5) $color=G $number=5
  • 魔法、1WWU(4) $color=M $number=4
  • 伝説的な場所 $color=L $number=0
  • 遺物、0 $color=C $number=0
  • 伝説のクリーチャー - エルドラージュ15/15、15(15) $color=C $number=15

答え1

次の手順でオンラインで作業を完了できますsed

sed '/(\?\([0-9]\+\))\?$/s//; number=\1/
     t n
     s/$/; number=0/
     :n
     /^.*, [0-9]\?\([WURBG]\)/{
                               s//color=\1/
                               s/[WURBG]\{2,\}/M/
                              }
     /[Ll]and/s/^[^;]*/color=L /
     /color/!s/^[^;]*/color=C /' file

しかし、putコマンドを提供したいと思いますscript file

#!/bin/sed -f
/(\?\([0-9]\+\))\?$/s//; number=\1/
t n
s/$/; number=0/
:n
/^.*, [0-9]\?\([WURBG]\)/{
    s//color=\1/
    s/[WURBG]\{2,\}/M/
}
/[Ll]and/s/^[^;]*/color=L /
/color/!s/^[^;]*/color=C /

それから

sed -f script.file file

上記のすべての正規表現は、あなたの例でのみテストされました。正しく機能しない問題が発生した場合は、少し調整して問題を解決できます。

答え2

grepsedよりプリミティブなUnixツール(、、、など)をシェルスクリプトでラップすることでこの種の操作を実行できますが、awkこの種の問題は強力な正規表現システムを備えた完全なプログラミング言語で処理する必要があります。個人的に私はPerlを選びます。

#!/usr/bin/perl -w
use strict;

my $line = 0;
my ($junk, $color, $number);

open my $data, '<', 'data.txt' or die "open: $!\n";
while (<$data>) {
    chomp;
    ++$line;

    if (m/Land/) {
        print "color=L, number=0\n";
    }
    else {
        ($junk, $color, $number) = m/, (\d+)?([WURBG]+) \((\d+)\)$/;
        if (defined $color and defined $number) {
            $color = 'M' if length($color) > 1;
            print "color=$color, number=$number\n";
        }
        else {
            ($junk, $number) = m/, (\d+)? ?\((\d+)\)$/;
            if (defined $number) {
                print "color=C, number=$number\n";
            }
            else {
                print "Line #$line is malformed!\n";
            }
        }
    }
}

data.txt以下が含まれます:

Sorcery, R (1)
Creature — Beast 5/3, 4G (5)
Sorcery, 1WWU (4)
Legendary Land
Artifact, (0)
Legendary Creature — Eldrazi 15/15, 15 (15)

あなたが投稿したものとは1つの違いがあります。質問の「Artifact」行にはゼロ値の周りに角括弧がないため、パーサーで例外処理が必要です。追加することは可能ですが、データファイルの形式を変更するよりも優れた理由がわかりません。

私はあなたがこのスクリプトのように色と値だけを印刷したくないと思います。print各行に一意のコードを追加できます。

この$junkビットは、カラー文字の前の数字が重要である可能性があるという仮定から来ています。私はこれをパーサーが作業を完了するのを助けるために使用します。数値が本当に必要な場合は、$junk意味論的な意味を持つように変数名を変更できます。私はその価値が何を意味するのか分からないので、これは私にとって「ジャンク」です。


関連情報