문자열의 두 단어를 두 변수로 복사

문자열의 두 단어를 두 변수로 복사

일반적으로 "something, numColor (number)"와 같이 문자열에서 $color 및 $number 변수를 가져오고 싶습니다. 색상은 W, U, B, R, G일 수 있습니다. 색상이 없으면 쉼표 앞의 문자열에 land 또는 L이라는 단어가 없으면 변수 색상은 C여야 합니다. 색상이 두 개 이상인 경우 $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)

귀하가 게시한 것과는 한 가지 차이점이 있습니다. 질문의 "Artifact" 줄에는 0 값 주위에 대괄호가 없으므로 파서에서 예외 처리가 필요합니다. 추가하는 것이 가능하지만 데이터 파일의 형식을 수정하는 것보다 더 나은 이유를 모르겠습니다.

나는 당신이 이 스크립트처럼 색상과 값만 인쇄하고 싶지는 않을 것이라고 가정합니다. print각 줄에 고유한 코드를 추가 할 수 있습니다 .

$junk비트는 색상 문자 앞의 숫자가 중요할 수 있다는 가정에서 비롯됩니다. 나는 이것을 파서가 작업을 완료하는 데 도움을 주기 위해 사용합니다. 숫자가 정말로 필요한 경우 $junk의미론적 의미를 갖도록 변수 이름을 바꿀 수 있습니다. 나는 그 가치가 무엇을 의미하는지 전혀 모르기 때문에 이것은 나에게 단지 "정크"일 뿐입니다.


관련 정보