일반적으로 "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
grep
sed
보다 원시적인 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
의미론적 의미를 갖도록 변수 이름을 바꿀 수 있습니다. 나는 그 가치가 무엇을 의미하는지 전혀 모르기 때문에 이것은 나에게 단지 "정크"일 뿐입니다.