2014-07-14 2 views
7

텍스트 파일에 반복되는 정확한 텍스트 줄이 있지만 각각 하나만 필요합니다.모든 고유 라인 추출

AAAAA 
AAAAA 
AAAAA 
BB 
BBBBB 
BBBBB 
CCC 
CCC 
CCC 

나는 것 만하면 그것에서 다음과 같은 네 가지 라인 :

AAAAA 
BB 
BBBBB 
CCC 

내가 정규식을 지원하는 텍스트 편집기 (엠 에디터 나 메모장 ++), 사용하고, 아닌 이 텍스트 파일을 상상해 프로그래밍 언어이므로 순전히 정규식을 사용해야합니다.

어떤 도움이 필요합니까?

EDIT : 내가 언급 한 다른 스레드를 확인했는데이 스레드가 동일하지 않다는 것을 분명히하고 싶습니다. 두 가지 모두 중복 된 줄을 제거해야하지만이를 달성하는 방법은 다릅니다. 순수한 RegEx가 필요하지만 다른 스레드의 최상의 대답은 특정 메모장 ++ 플러그인 (더 이상 제공되지 않는 플러그인)을 사용하므로 정규식 솔루션이 아닙니다. 두 번째 경우는 정규 표현식이며 Notepad ++에서는 작동하지만 EmEditor에서는 전혀 작동하지 않습니다. 그래서 내 질문은 그 링크를 반복하는 것이 아니라고 생각합니다. 링크가 유용하기는하지만 hsz에 감사드립니다.

+0

(http://stackoverflow.com/questions/3958350/removing-duplicate-rows-in-notepad)는 – hsz

+0

반복 선이 함께 그룹화 [메모장 중복 행 분리 ++]의 중복 가능성? 즉, 파일을 AAAA BBBB AAAA BBBB로 만들 수 있습니다. 그러면 AAAA BBBB를 만들 수 있습니까? –

+0

Gelbukh에 대한 답변 : 줄은 원래 있던 줄과 정확히 일치해야합니다. –

답변

7

거의 동일한 두 개의 옵션 :

일치하는 라인이 일치하지만, 그들을 추출

(?sm)(^[^\r\n]+$)(?!.*^\1$) 

반복되지 않는 모든 라인, 당신은 정말 다른 사람을 대체합니다.

모두 바꾸기를 반복 라인

이 메모장에서 잘 작동합니다 ++ :

검색 : (?sm)(^[^\r\n]*)[\r\n](?=.*^\1)

교체 :

  • (?s)

    는 점을 허용, DOTALL 모드를 활성화 빈 문자열 줄을 따라 일치 시키려면
  • (?m)
  • ^ 앵커는 우리가 문자열의 시작 부분에 있음을 주장, 각 라인
  • (^[^\r\n]*)에 맞게 ^$을 허용, 멀티 라인 모드를 전환 그룹 1 라인을 캡처
  • [^\r\n]*
  • 룩어 (?!.*^\1$) 우리가 C의 수와 일치 할 수 있다는 주장
  • [\r\n] 경기가 개행 문자 개행 문자되지 않은 모든 문자와 일치 haracters .*, 그 다음 ...
  • ^\1$ 동등한 라인 그룹으로 이동하도록 제공 그룹 1
+0

''모든 반복 라인 바꾸기 '옵션을 추가했습니다. 라인을 "추출"하기 때문에 텍스트 편집기에서 더 잘 작동합니다. – zx81

+0

대단히 감사합니다. 두 번째 RegEx (모든 반복 행 교체)가 필요한 것입니다. 첫 번째는 반대입니다 (그러나 유용 할 수도 있으므로 그대로 두십시오). EmEditor와 Notepad ++ 모두 똑같이 작동하지만 빈 줄은 제거하지 않습니다. :(이미 '|^\ n $'을 끝에 추가하려고했으나 아무 것도하지 않습니다. 도와 주시면 최선의 답변이 될 것입니다. :) –

+0

수정 된 답변을 참조하십시오. 이 방법이 효과가 있으면 왼쪽의 체크 표시를 클릭하여 답변을 수락하는 것을 고려해보십시오. 이제 담당자 시스템이 사이트에서 작동합니다. 감사! – zx81

0

같은 라인, 즉, 펄 표기법 다음 작품 AAAA AAAA BBBB BBBB하지 AAAA BBBB AAAA BBBB이다

s/(^.*$)(\r?\n\1$)*/$1/gm; 

수단/^^$ (\ r? \ n \ 1 $) /을 $ 1에 대한 전역 및 다중 행 모드로 대체하십시오 (^ 및 $ 내부 일치 \ n).

이 표현식은 임의의 수의 등행이 따르는 완전한 행이 단일 어커런스로 대체됨을 의미합니다.

그런 정규식을 적용하는 방법에 대한 특정 편집기의 도움말을 참조하십시오.

+0

감사하지만, 이것은 내가 요청한 간단한 텍스트 편집기가 아닙니다. 나는 마지막 부분없이 그것을 시도했지만, 여전히 작동하지 않습니다. –

0

Notepad ++ 또는 EmEditor에서 작동하지만 대체 기능이있는 PHP/JavaScript/Python에서 잘 작동하는지 모르겠습니다.

^(.+)(\n(\1))*$ 

여기

Demo은 단순히 텍스트를 복사하여 내가 당신을 공유 링크에서 최종 결과를 얻을 수 있습니다.

+1

링크를 보내 주셔서 감사 드리며, debuuger가 유용합니다. 그러나 정규 표현식은 문자가 아닌 문자를 대체해야하므로 실제 필요하지는 않습니다. 그래서 나는 \ w를 바꿨다. 하지만 이제는 EmEditor와 Notepad ++의 모든 것을 디버거에서 잘 작동합니다 ... 어쩌면 다른 정규식 표준을 사용하고 있습니다 ... –

+0

notepad에서 작동하지 않는 이유를 모르겠습니다 ++ – Braj

2

다음 정규식을 사용하여 반복 및 빈 줄을 모두 제거 할 수 있습니다.

Find: ^(.*)(\r?\n\1)+$ 
Replace: \1 
+0

감사합니다. 좋은 솔루션이지만 Notepad ++에서만 작동합니다. 나는 물음표를 제거했다 '?EmEditor에서 작동되도록하기 위해서,하지만 여전히 몇 줄만 제거하면됩니다. 이 코드는 EmEditor (프로그램 자체)의 버그가 아니므로 올바른 대답이라고 생각합니다. 그러나 그 중 하나만 선택해야했기 때문에 대답을 자세히 설명했기 때문에 zx81에서 하나를 선택했습니다. 대체 (실용적)가 필요하지 않고 원래 파일에있을 수있는 빈 줄을 제거합니다 (내가 필요로하는 것), 물론 두 에디터에서와 같이 작동합니다. –