메모장 중복 줄 삭제

메모장 중복 줄 삭제

메모장++에서 중복된 줄을 어떻게 삭제하나요? 몇 가지 예를 보았지만 대부분은 오래되었으며 솔루션이 현재 작동하지 않습니다.

영상

내가 가지고 있다고 가정 해 봅시다 :

Example
Example
1
1
3

원하는 것:

Example
1
3

32비트 메모장++ 또는 TextFx 도구에 플러그인 관리자가 없는 것 같습니다.

답변1

귀하가 고려할 수 있는 몇 가지 가능한 솔루션을 제공했습니다. 당신이 이미 알고 있는 내용을 언급하더라도 용서해주세요. =)

TL;DR

Notepad++ v7.7.1부터 Notepad++에는 다음과 같은 기능이 있습니다.연속된 중복 줄 제거이는 아래에 제공된 다른 두 가지 솔루션과 동일한 작업을 수행합니다(즉, 연속된 중복 행을 제거합니다).

다음을 사용하여 액세스할 수 있습니다.편집 → 라인 작업 → 연속 중복 라인 제거.


보다바틀비의 대답정렬하지 않고 줄을 중복 제거하는 정규식의 예는 아래를 참조하세요.


원래 답변

@máté-juhász의 의견에 따르면 이에 대한 답변은 다음과 같습니다.StackOverflow 질문예제 데이터로 작업합니다.

본질적으로:

  • 열려 있는검색 → 바꾸기...( Ctrl+ H) 메모장++에서.

  • "찾을 내용:" 필드에 다음을 입력합니다.정규식:

     ^(.*?)$\s+?^(?=.*^\1$)
    
  • "바꿀 내용:" 필드를 비워두고 "검색 모드" 옵션에서 "정규식"을 표시했는지 확인하세요.

  • 줄을 제거할 준비가 되면 "모두 바꾸기"를 클릭하세요.

원래 답변은 옵션 . matches newline을 선택해야 함을 나타내는 것 같지만 댓글에 있는 일부 사람들은 옵션을 선택하지 않은 채로 두는 것이 더 나은 행운을 얻은 것 같습니다. 귀하의 데이터에 대해서는 체크하지 않은 상태로 두었는데 잘 작동하는 것 같았습니다.

전. 정규식 사용

정규식 대체 예


유니크 사용하기

대안으로, Unix 기반의 Windows 포트가 있는 경우 필요에 맞는 다른 옵션이 없다고 가정합니다.유니크유틸리티를 사용하면 Notepad++를 사용하여 이를 작업 흐름에 통합할 수 있습니다.

즉, uniq위의 정규식과 동일한 기능을 수행하지만 잠재적으로 더 안정적인 방식으로 수행됩니다. 단점은 Notepad++와 통합하는 것이 약간의 해킹이라는 것입니다. 이를 염두에 두고 시도해보고 싶다면 기본 단계가 아래에 설명되어 있습니다.

고유 얻기

시작하려면 Windows용 사본이 필요합니다 uniq. 여러 가지 옵션을 사용할 수 있지만 단순화를 위해 다음을 제안할 수 있습니다.GnuWin32 CoreUtils 패키지. uniq​현재 다음을 다운로드할 수 있습니다.경량 설치 프로그램CoreUtils 패키지 구성 요소의 압축 버전을 직접 다운로드하여 결합하지 않기로 선택한 경우.

팁으로, 와 관련된 솔루션의 모든 단계에서 uniq공백이 있는 경로 사용을 건너뜁니다. Unix는 Windows와 다르게 디렉토리 이름의 공백을 처리하는 경우가 많으므로 해당 환경에서 이식된 유틸리티에는 공백과 관련된 문제가 있을 수 있습니다.


참고로 의 GnuWin32 빌드에 어떤 파일 크기 제한이 적용될 수 있는지는 잘 모르겠지만 uniq, 최소한 몇 메가바이트(종종 수십만 줄)의 데이터가 포함된 텍스트 파일에 쉽게 사용하는 경우가 많습니다.


Notepad++에서 uniq 사용하기

설치 되면 uniq배치 파일에 다음 줄과 유사한 내용을 배치합니다.

C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()

이 배치 파일을 편안하게 사용할 수 있는 영구 디렉토리에 저장하십시오. 참고로 이렇게 부르겠습니다uniq_npp.bat. "temp"는 어떤 폴더든 될 수 있지만 "tmp"와 "temp"는 Windows에 이미 존재하는 경우가 많습니다. 마찬가지로 "uniq_tmp.txt"는 일관되게 사용되는 한 원하는 이름이 될 수 있습니다.

저장 후uniq_npp.bat, 그러면 해당 기능을 Notepad++에 통합할 준비가 되었습니다. 이렇게 하려면 메모장++를 엽니다.달리다...메뉴( F5)를 클릭하고 나타나는 필드에 다음과 유사한 내용을 입력합니다.

cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"

가장 왼쪽의 "실행" 버튼을 클릭하면 Notepad++ 명령을 저장하기 전에 테스트할 수 있습니다.

전. 실행... 대화상자

실행 대화 상자 예

그렇지 않으면 "저장..."을 클릭하고 명령 이름을 적절하게 지정하십시오. 원하는 경우 키보드 단축키를 지정할 수 있지만 필수는 아닙니다. 명령 설정을 유지하고 다음 위치에 배치하려면 "확인"을 클릭하세요.달리다...나중에 사용할 수 있는 드롭다운 메뉴입니다.

전. 드롭다운 메뉴 실행

실행 메뉴 항목 예


uniq귀하가 관심을 갖고 있다고 가정하여 이 답변 끝에 있는 "참고" 섹션에서 솔루션의 작동 방식에 대한 세부 사항에 대한 매우 간략한 개요를 제공합니다 .


주의사항

이 솔루션에 대해 기억해야 할 중요한 점 중 하나 uniq절대적으로 필요하다디스크에 저장된 파일의 경로(문서는 Notepad++만으로는 열 수 없습니다).

이는 열어본 기존 파일에는 문제가 되지 않지만, 새 파일을 만들거나 기존 원본을 변경하는 경우에는 다음을 수행해야 합니다.구하다실행하기 전에 먼저uniq_npp.bat파일. 그렇지 않으면 작업이 실패하고 새 데이터가 정렬되지 않습니다.

작은 장점으로, 이 저장 제한이 위의 정규식 옵션에 적용되지 않는다는 점을 언급할 가치가 있을 것입니다.


노트

정렬

제공된 솔루션(즉, 초기 정규식 및 uniq)은 모두 제거하려면 중복된 줄이 서로 바로 위에 표시되어야 합니다. 예:

duplicate line X
duplicate line X

즉, 이러한 작업 중 하나를 적용하기 전에 데이터를 정렬하는 것이 중요합니다. 나는 당신의 예제 데이터를 고려하여 이미 이 작업을 수행하고 있다고 가정하지만 어쨌든 언급할 가치가 있습니다.

메모장++ 매크로

작은 제안으로, Notepad++에는 내장된 줄 정렬 작업에 대한 실제 키보드 단축키가 없으므로 정렬에 도움이 되는 매크로를 기록하는 것이 좋습니다. 특히, 녹음할 수 있습니다.편집 → 모두 선택( Ctrl+ A) 연산을 수행한 다음 다음 중 하나를 선택합니다.편집 → 라인 작업 → 사전순으로 라인 정렬옵션.

해결책을 위해 uniq정렬 매크로의 마지막 단계로 "저장" 작업을 기록하는 것도 고려해 볼 가치가 있습니다. 또한 정규식 옵션에 대한 단계(바꾸기 대화 상자 열기, 정규식 입력 등)도 편리한 매크로에 기록할 수 있습니다.

uniq 솔루션의 작동 방식

간단히 말해서:

  • "Run..." 줄은 명령 창( cmd /k)을 생성하고 다음을 호출합니다.uniq_npp.bat선택한 현재 파일이 저장된 위치에 대한 경로를 제공합니다.

  • ~ 안에uniq_npp.bat%*, 이 경로는 에 전달된 와일드카드를 통해 캡처됩니다 uniq. 그런 다음 에서 중복 제거된 데이터가 "uniq_tmp.txt"로 uniq리디렉션됩니다( ).>

  • 마지막으로 배치 파일은 이 정리된 텍스트를 새 Notepad++ 탭에서 열고 명령 창은 를 통해 닫힙니다 exit().

uniq_npp.bat 개선(?)

정렬과 관련하여 또 다른 옵션은 Notepad++를 사용하여 모든 항목을 함께 정렬하는 것을 건너뛰는 것입니다. 정렬 옵션과 관련된 프로세스에서 유연성이 다소 손실될 수 있지만 다음을 통해 배치 파일의 추가 단계로 항목을 정렬할 수 있습니다.윈도우 정렬명령. 이 단계를 추가하려면 첫 번째 줄을 수정하면 됩니다.uniq_npp.bat다음과 같이:

sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt

이는 단순히 정렬된 데이터를 에서 으로 파이프 sort합니다 uniq. 보시다시피 sort이제 처음에는 가 아닌 데이터 경로를 캡처합니다 uniq.

또 다른 생각은 (아마도) %*문자열 작업의 일부로 와일드카드를 사용하여 원본 파일 이름을 얻고 예를 들어 "uniq_tmp.txt"를 "original-filename_uniq.txt"와 같은 이름으로 대체하여 더... 독특하게 만드는 것입니다.

잠재적인 함정

  • 기본적으로 Windows는 sort숫자를 다음과 같이 정렬합니다.

     1
     11
     2
     21
    

0이 앞에 오지 않는 경우(예 01, 02, 011, 021: ).

  • GnuWin32 CoreUtils 패키지에는 다음 포트가 포함되어 있습니다.유닉스 정렬유틸리티(Windows보다 더 강력한 옵션이 있음 sort), 이 특정 구현(대부분의 GnuWin32 유틸리티와는 달리)은 Windows에서 약간 좋지 않은 것으로 보입니다. 그러나 Unix 버전의 다른 Windows 포트를 사용하는 경우 sort이 문제가 적용되지 않을 수 있으며 전체적으로 더 나은 옵션이 될 수 있습니다.

답변2

나는 이것이 순서가 맞지 않은 항목에 대해 잘 작동한다는 것을 발견했습니다.

찾다: (?s)^(.*?)$\s+?^(?=.*^\1$)

'바꿀 내용:' 필드에 아무것도 없는 '모두 바꾸기'를 클릭합니다.

편집하다:

단계별 방법은 다음과 같습니다.

(?s) 점은 개행 문자와도 일치합니다.

^ 줄의 시작

(.*?)$ 발견된 줄의 첫 번째 끝까지 0개 이상의 문자를 탐욕스럽지 않게 일치시켜 첫 번째 캡처 그룹을 설정합니다.

\s+? 탐욕스럽지 않게 하나 이상의 공백 문자와 일치합니다.

^ 줄의 시작 (다시)

(?= 비캡처 그룹에 대한 긍정적인 예측(이 패턴은 일치해야 하지만 저장되지는 ​​않습니다).

.*^\1$) 전체 줄이 첫 번째 캡처 그룹과 일치하는 새 줄이 나올 때까지 계속해서 0개 이상의 문자를 일치시킵니다.

따라서 정규식은 캡처 그룹을 만든 다음 해당 줄과 정확히 일치하는 줄을 찾고 원래 줄을 아무것도 바꿀 때까지 문서의 모든 줄을 검색합니다.

부록: 당시에는 미처 생각하지 못했고 정규식 작성자에게 사과했지만스캇다른 사람이 만든 정규식의 아주 약간 수정된 버전을 사용하고 있다는 점에서 정확합니다. 내가 그 출처를 추측한다면, 아마도 그가 제공한 링크에서 실제로 찾을 수 있는 답변일 가능성이 더 높다고 생각합니다.여기.

마지막으로 다음 사항에 대해 사과드립니다.

  1. 기한이 지난 곳에 신용을 제공하지 않습니다. 그 당시에는 그런 생각을 하지 않았지만 그랬어야 했어요.
  2. 내가 제공한 답변을 완전히 설명하지 않으면 무슨 일이 일어나고 있는지에 대한 누군가의 이해가 높아져 해당 정보를 다른 문제에 사용할 수 있습니다.
  3. Scott의 의견에 더 빨리 응답하지 않습니다. 나는 이 사이트 사용에 대해 그다지 전문가가 아니며(따라서 점수가 낮음) 오늘까지 내 알림을 확인할 생각을 하지 않았습니다.

맙소사!

답변3

감사합니다. 하지만 regex와 uniq는 서로 옆에 중복된 줄만 감지했습니다. awkuniq-npp.bat 대신 이 awk 스크립트를 사용하면 Notepad++와 호환됩니다. 4줄 박쥐 파일:

C:\pathto\awk.exe '(a[$0]++==0)' %* > %*.1
델 %*
%*.1 %* 이동
출구()
실행할 명령:

cmd /k C:\pathto\awkuniq-npp.bat "$(FULL_CURRENT_PATH)"

동일한 파일 이름을 대체하기 위해 del/move 후에 자동 다시 로드를 사용합니다.

답변4


다음 검색/정규식 바꾸기(줄 정렬 후)를 사용하면 이해하기가 더 직관적입니다.

Find: (.*)\r?\n(\1\r?\n)+

Replace with: \1\r\n

설명:
- "무엇이든"(텍스트 줄) 뒤에 새 줄(\n 또는 \r\n)이 오는 것을 찾습니다.\r?\n
- 줄의 내용을 변수에 유지합니다: (.
)\r?\n
- 같은 줄이 한 번 이상 다시 나타나는지 확인합니다. (.*)\r?\n(\1\r?\n)+

교체: - 위의 내용을 모두 줄 자체와 새 줄로 바꿉니다: \1\r\n

도움이 되길 바랍니다,
sb3k

관련 정보