2012-12-07 2 views
1

나는이 질문을하는 법을 잘 알고 있습니다. 스키마 (스키마)를 조정할 거대한 XML에 숫자를 그리는 (대부분) 알파 숫자 목록이 있습니다. 생성 된 방법에 대한 표준이없는 것 같습니다. 그래서 유효성을 검사 할 수 있도록 XSD 정규식 패턴을 만들려고합니다. 일반적으로, 나는 그들을 통해 갈아서지만,이 경우 수백 가지가 있습니다. 내가 뭘 원하는지 각각의 도면 번호의 단일 인스턴스로 그들을 분리하고 그 다음, 나는 XSD에 적절한 OR 문과 정규식을 만들 수 있습니다.정규식을 사용하여 결과 유형의 인스턴스 하나만 표시

내 환경은 Win7이지만 우분투 VM과 Cygwin (현재이 모든 작업을 수행하고있는 곳)이 있습니다. 나는 이것을 할 수있는 리눅스 유틸리티가 있는지 또는 내 grep/sed-fu가 약한 지 모르겠습니다. 나는 브 루트 포스를 제외하고이 문제를 어떻게 줄일 것인지 잘 모른다. (나는이 퍼즐의 다른 조각들에 대해서는이 조각만큼 크지 않았다.)

이 명령 줄 문을 사용하여 그림 "숫자"를 가져 왔습니다. 여기

grep "DrawingNumber" uber.xml | sort | uniq | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' 

실제 도면의 일부 샘플입니다 "번호"(수백 개가) : 그것은 단지를 둘러싸는 태그 나에게 유니크을 제공 한 다음 벗겨 그들을 정렬, 도면 번호를 찾습니다

10023C/10024C *<= this is how it's represented in the XML & I can't (easily) change it. 
10023C 
10043E 
10051B 
10051D 
10058B 
10059C 
10447B 10447B *<= this is how it's represented in the XML & I can't (easily) change it. 
10064A 
10079B 
10079D 
10082B 
10095A 
10098B 
10100B 
10102 
10109B 
10109C 
10115 
101178 
10118F 

원하는 것은 도면 번호 목록을 각 유형의 단일 인스턴스로 줄이는 목록입니다. 예를 들어, 도면의이 그룹 "번호"

nnnnnx 

내가 너무 같은 패턴을 생성 할 수있는 단일 문자 다음에 5 자리의 모든 인스턴스를 나타내는 :

10023C 
10043E 
10051B 
10051D 
10058B 
10059C 

가에 줄일 수 : 마찬가지로

[0-9]{5}[a-z A-Z]{1} 

,

10102 
10115 
다음 아무것도 5 자리의 모든 인스턴스를 나타낼 것이며 캡처 할 수있는

nnnnn 

: 등등

[0-9]{5} 

및 53,691,363,210

는로 감소한다. 문제를 실행 가능한 형태로 제시하기에 충분한 정보가되기를 바랍니다. 내가 말했듯이, 나는 질문을 틀 짓는 방법조차도 몰랐고 종종 질문을 썼을 때 나는 해결책을 실현했다. &도 제출하지 않았지만,이 하나가 나를 곤혹스럽게 만든다.

업데이트 : @의 nullrevolution의 답변을 사용 , 여기에 내가 (이 내 의견을 명확히하는보다 크게 읽을 수) 해낸거야.

나는 결국 사용하는 명령 줄은 :이처럼 보였다 데이터에

grep "DrawingNumber" uber.xml | sort -d | uniq | sed -e :a -e 's/<[^>]*>//g;/</N;//ba' | sed 's/[A-Za-z]/x/g;s/[0-9]/n/g' | sort -u 

: 나에게 내 모든 데이터를 위하지 니펫에 대한의 총칭 출력 (준

<DrawingNumber>10430A</DrawingNumber> 
<DrawingNumber>10431</DrawingNumber> 
<DrawingNumber>10433</DrawingNumber> 
<DrawingNumber>10434</DrawingNumber> 
<DrawingNumber>10443A</DrawingNumber> 
<DrawingNumber>10444</DrawingNumber> 
<DrawingNumber>10446</DrawingNumber> 
<DrawingNumber>10446A</DrawingNumber> 
<DrawingNumber>10447</DrawingNumber> 
<DrawingNumber>10447B 10447B</DrawingNumber> 
<DrawingNumber>10447B</DrawingNumber> 
<DrawingNumber>10454A</DrawingNumber> 
<DrawingNumber>10454B</DrawingNumber> 
<DrawingNumber>10455</DrawingNumber> 
<DrawingNumber>10457</DrawingNumber> 

) :

nnnnn 
nnnnnn 
nnnnnx 
nnnnnx nnnnnx 
nnnnnx/nnnnnx 
nnxxx 

정확하게 필요한 것은 무엇입니까. 알아야 할 다음 두 가지 사례가이 새로운 방법으로 인해 도움이 될 것입니다. 누가이 시간을 얼마나 절약했는지 알 수 있습니까?

+0

'[a-z A-Z] '의 공백으로 패턴이 실제로 공백 문자와 일치 할 수 있다는 것을 알고 계십니까? –

+0

@ m.buettner, 실제로, 나는 정규식을 만들기 위해 [Rubular] (http://www.rubular.com)를 사용하고 있었고'[a-zA-Z]'라고 말하고있었습니다. 아마 루비 일 (그리고 나는 루비를 모른다),하지만 그것을 지적 해 주셔서 감사합니다. – delliottg

답변

2

는 먼저 바깥 쪽 태그를 벗겨보십시오 : "X"와 "N"모든 문자와 모든 번호를 대체 할

sed 's/[A-Za-z]/x/g;s/[0-9]/n/g' file | sort -u 

은, 모든 중복을 제거합니다. 샘플 입력 파일에 대해

실행, 출력은 : 그것은 가능하지 만약

nnnnnx 

는, 당신은 원래의 형태로 입력 파일의 일부를 공유 할 수 있을까?

+0

그것은 훌륭합니다! 난 그냥 ("파일"을 제거하고) 마지막에 당신의 비트에 태그를 지정하여 파일에 대해 그것을 실행하고이 결과였다 : nnnnn은 에서 nnnnnn nnnnnx nnnnnx nnnnnx nnnnnx/nnnnnx nnxxx 그리고 전체 명령 행은 다음과 같습니다. grep "PCBDrawing"uber.xml | 정렬 -d | 유니크 -s5 | sed -e : a -e 's/<[^>] *> // g;/ delliottg

+0

완벽! 다행히 도와 줬어 :) – nullrevolution

관련 문제