การลบแถวที่ซ้ำกันใน Notepad ++


595

เป็นไปได้ไหมที่จะลบแถวที่ซ้ำกันใน Notepad ++ ออกจากการเกิดบรรทัดเดียว?

คำตอบ:


760

Notepad ++ สามารถทำสิ่งนี้ได้หากคุณต้องการจัดเรียงตามบรรทัดและลบบรรทัดที่ซ้ำกันออกในเวลาเดียวกัน

คุณจะต้องใช้ปลั๊กอิน TextFX นี้เคยถูกรวมอยู่ในรุ่นเก่าของ Notepad ++ Plugins -> Plugin Manager -> Show Plugin Manager -> Available tab -> TextFX -> Installแต่ถ้าคุณมีรุ่นที่ใหม่กว่าคุณสามารถเพิ่มได้จากเมนูได้โดยไปที่ ในบางกรณีอาจมีการเรียกใช้TextFX Charactersแต่นี่คือสิ่งเดียวกัน

TextFX -> TextFX Toolsกล่องกาเครื่องหมายและปุ่มที่จำเป็นในขณะนี้จะปรากฏในเมนูภายใต้:

ตรวจสอบให้แน่ใจว่าได้เลือก "เรียงลำดับผลลัพธ์เฉพาะที่ไม่ซ้ำกัน ... " จากนั้นเลือกบล็อกข้อความ ( Ctrl+ Aเพื่อเลือกทั้งเอกสาร) สุดท้ายคลิก "เรียงลำดับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่" หรือ "เรียงลำดับตัวพิมพ์เล็กและตัวพิมพ์ใหญ่"

เค้าโครงเมนูใน n ++


32
ปลั๊กอินที่ทรงพลังอย่างเหลือเชื่อแม้จะเป็น "อายุ" หวังว่าพวกเขาจะไม่ลบสิ่งนั้นออกจากข้อเสนอปลั๊กอิน NPP มาตรฐาน ผู้ชายที่คิดถึงคุณสมบัติทั้งหมดในปลั๊กอินนี้เป็น "ผู้มีวิสัยทัศน์"
GeertVc

7
มีประสิทธิภาพมากกว่า excel
วสุ

6
แล้วรุ่น Notepad ++ x64 ล่ะ? ไม่พบปลั๊กอิน TextFX รุ่น x64
Geograph

15
TextFx ไม่ได้อยู่ในรุ่น 64 บิต
Rhyous

4
@Geograph และจะไม่มีปลั๊กอิน 64 บิตของ TextFx ดูบันทึกย่อนี้ ดังนั้นจึงเป็นการดีที่จะทราบว่ามีปลั๊กอินสำรองที่ให้บริการการเรียงลำดับและลบข้อมูลที่ซ้ำกัน
Robert

641

ตั้งแต่ Notepad ++ เวอร์ชัน 6คุณสามารถใช้ regex นี้ในการค้นหาและแทนที่การสนทนา:

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

และแทนที่ด้วยอะไร สิ่งนี้จะละจากแถวที่ซ้ำกันทั้งหมดที่เกิดขึ้นครั้งสุดท้ายในไฟล์

ไม่จำเป็นต้องมีการเรียงลำดับสำหรับสิ่งนั้นและแถวที่ซ้ำกันสามารถอยู่ที่ใดก็ได้ในไฟล์!

คุณต้องตรวจสอบตัวเลือก "การแสดงออกปกติ" และ "การจับคู่ขึ้นบรรทัดใหม่":

Notepad ++ แทนที่กล่องโต้ตอบ

  • ^ ตรงกับจุดเริ่มต้นของบรรทัด

  • (.*?)จับคู่อักขระใด ๆ 0 ตัวหรือมากกว่า แต่น้อยที่สุดเท่าที่จะเป็นไปได้ (ตรงกับแถวทุกประการนี่เป็นสิ่งจำเป็นเนื่องจากตัวเลือก ". match newline") แถวที่ตรงกันจะถูกเก็บไว้เนื่องจากมีวงเล็บอยู่รอบ ๆ และสามารถเข้าถึงได้โดยใช้\1

  • $ ตรงกับจุดสิ้นสุดของบรรทัด

  • \s+?^ ส่วนนี้จะตรงกับอักขระช่องว่างทั้งหมด (บรรทัดใหม่!) จนถึงจุดเริ่มต้นของแถวถัดไป ==> สิ่งนี้จะลบบรรทัดใหม่หลังจากแถวที่ตรงกันเพื่อให้ไม่มีแถวว่างอยู่หลังจากการแทนที่

  • (?=.*^\1$)นี่คือการยืนยัน lookahead ในเชิงบวก นี่คือส่วนที่สำคัญใน regex นี้แถวจะถูกจับคู่เท่านั้น (และถูกลบออก) เมื่อมีแถวเดียวกันตรงตามที่อื่นในไฟล์


10
โอ้, อันนี้ยอดเยี่ยม, มันลบแถวที่ว่างเปล่า, ฉันกำลังทำมันในขณะนี้ :)
Aprillion

66
มันจะลบบรรทัดทั้งหมดในไฟล์ในบางกรณี
SerG

3
มีวิธีใดที่จะลบเหตุการณ์ที่เกิดขึ้นล่าสุดหรือไม่ ตรงนี้ทั้งหมดยกเว้นคนสุดท้าย ...
Cullub

28
ในกรณีของฉันที่โซลูชันนี้ลบทุกบรรทัดให้ยกเลิกการ. matches newlineทำเครื่องหมายที่เคล็ดลับ
Kuitsi

3
@SerG ในบางกรณีก็ไม่ได้ทำงานสำหรับเรา แต่เมื่อฉันออก "แมตช์การขึ้นบรรทัดใหม่" มัน :)
Davidenko

95

หากแถวอยู่ติดกันคุณสามารถใช้ regex แทนที่ได้ทันที:

รูปแบบการค้นหา: ^(.*\r?\n)(\1)+

แทนที่ด้วย: \1


1
บางทีคนอื่นอาจมีโชคกับสิ่งนี้ แต่สำหรับฉัน ^ (. * \ n) \ 1 ผลใน "ไม่พบข้อความ"
b1nary.atr0phy

4
@ b1naryatr0phy ตรวจสอบให้แน่ใจว่าคุณได้ตั้งค่า "โหมดค้นหา" เป็น "นิพจน์ทั่วไป" ฉันยังได้ปรับปรุงรูปแบบเพื่อให้สามารถจัดการกับการสิ้นสุดบรรทัดลักษณะของหน้าต่างได้
Grant Peters

3
notepad ++ มีเอ็นจิ้นแสง regex มันไม่อนุญาตให้ใช้ฟังก์ชั่นขั้นสูงไม่ใช่แม้แต่ "? หรือ \ r \ n" เพราะมันใช้ได้กับบรรทัดเดียวเท่านั้นและคุณใช้ $ สำหรับอักขระ \ r \ n
Stefan Rogin

3
สิ่งนี้จะกำจัดทีละคน คุณต้องทำซ้ำหลายครั้ง ฉันสงสัยว่าทำไม \ n + -> \ n ไม่ทำงาน (คิดว่าจะรายงานการเปลี่ยนใหม่จำนวนมาก)
Val

2
@Val หากคุณทำส่วนอ้างอิงย้อนกลับของการจับคู่กลุ่มที่มีการจับคู่ 1 ครั้งขึ้นไปรูปแบบจะจับคู่ N บรรทัดที่ซ้ำกันที่ต่อเนื่องกันในแต่ละครั้ง:^(.*\r?\n)(\1)+
Kenigmatic

37

Notepad ++

-> แทนที่หน้าต่าง

ตรวจสอบให้แน่ใจว่าในโหมดค้นหาคุณได้เลือกแสดงออกปกติปุ่ม

หาอะไร:

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

แทนที่ด้วย:

$ 1

ก่อน:

และเราคิดว่ามี

และเราคิดว่ามี

แถวเดียว

เป็นไปได้ไหมที่จะ

เป็นไปได้ไหมที่จะ

หลังจาก:

และเราคิดว่ามี

แถวเดียว

เป็นไปได้ไหมที่จะ


2
ไม่จำเป็นต้องมีการเรียงไฟล์เพื่อให้ทำงานได้หรือไม่
Peter Mortensen

นี่ยอดเยี่ยม
Remo Liechti

30

หากคุณไม่สนใจคำสั่งแถว (ซึ่งฉันไม่คิดว่าคุณทำ) จากนั้นคุณสามารถใช้กล่อง Linux / FreeBSD / Mac OS X / Cygwin และทำ:

$ cat yourfile | sort | uniq > yourfile_nodups

จากนั้นเปิดไฟล์อีกครั้งใน Notepad ++


3
ไม่ทำงานบน Windows 7'cat' is not recognized as an internal or external command, operable program or batch file.
Iain Samuel McLean Elder

2
@Iain Elder: cat เป็นยูทิลิตี Unix มาตรฐานซึ่งเป็นสาเหตุที่คำตอบนี้ระบุว่าทำงานบน linux, FreeBSD และ MacOSX คำตอบยังแนะนำ Cygwyn: นี่คือโปรแกรม windows ที่ให้เชลล์สไตล์ยูนิกซ์กับแมว เรื่องสั้นยาว (ช้าไป!): Win 7 ต้องการ Cygwin เพื่อทำสิ่งนี้
Travis Clark

11
ในหน้าต่างของคุณมี PowerShell:cat yourfile | sort -Unique
Elazar

9
นี่เป็นตัวอย่างที่ดีของ "การใช้แมวอย่างไร้ค่า" ลืมยูทิลิตี้ cat และใช้การเปลี่ยนเส้นทางไฟล์ดังนี้: sort <yourfile | uniq> yourfile_nodups
scott8035

1
@ scott8035 ฉันยอมรับว่า cat ไม่มีประโยชน์สำหรับการเรียกใช้คำสั่งนั้น แต่ฉันพบว่ามันมักจะเป็นประโยชน์ในการเริ่มต้นกับ cat เมื่อค้นหาลำดับของคำสั่งที่ไม่ชัดเจนอย่างยาวเช่นไฟล์ cat | ใจ ... ใจ ... sed ... และอื่น ๆ ดังนั้นฉันจะบอกว่าอาจมีเหตุผลในการใช้แมว แน่นอนว่าสามารถถอดแมวออกได้ในตอนท้าย แต่ก็มีบางตัวที่ขี้เกียจเกินไป
FORTRAN

17

Notepad ++ รุ่นหลังดูเหมือนจะไม่รวมปลั๊กอิน TextFX เลย เพื่อที่จะใช้ปลั๊กอินสำหรับการเรียงลำดับ / กำจัดรายการที่ซ้ำกันปลั๊กอินจะต้องดาวน์โหลดและติดตั้ง (เกี่ยวข้องมากกว่า) หรือเพิ่มโดยใช้ตัวจัดการปลั๊กอิน

A) วิธีที่ง่าย (ดังอธิบายไว้ที่นี่ )

ปลั๊กอิน -> ตัวจัดการปลั๊กอิน -> แสดงตัวจัดการปลั๊กอิน -> แท็บที่ใช้ได้ -> ตัวอักษร TextFX -> ติดตั้ง

B) วิธีที่เกี่ยวข้องมากกว่านี้หากจำเป็นต้องมีรุ่นอื่นหรือวิธีที่ง่ายไม่ทำงาน

  1. ดาวน์โหลดปลั๊กอินจาก SourceForge:

    http://downloads.sourceforge.net/project/npp-plugins/TextFX/TextFX%20v0.26/TextFX.v0.26.unicode.bin.zip

  2. เปิดไฟล์ zip และแตกNppTextFX.dll

  3. สถานที่NppTextFX.dllใน Notepad ++ ปลั๊กอินไดเรกทอรีเช่น:
    C: \ Program Files \ Notepad ++ \ ปลั๊กอิน

  4. เริ่ม Notepad ++ และ TextFX จะเป็นหนึ่งในรายการเมนูไฟล์ (ดังที่เห็นในคำตอบ # 1 ข้างต้นโดย Colin Pickard)

หลังจากติดตั้งปลั๊กอิน TextFX ทำตามคำแนะนำในคำตอบ # 1 เพื่อเรียงลำดับและลบรายการที่ซ้ำกัน

นอกจากนี้ให้ลองตั้งค่าแป้นพิมพ์ลัดโดยใช้การตั้งค่า> ตัวทำแผนที่ชอร์คัตหากคุณใช้คำสั่งนี้บ่อยครั้งหรือต้องการจำลองแป้นพิมพ์ลัดเช่น F9 ใน TextPad เพื่อเรียงลำดับ


ใน Notepad ++ 7.6 plug-in C:\Users\<your_user>\AppData\Local\Notepad++\plugins\NppTextFXควรจะเพิ่ม นอกเหนือจากนี้ยังใช้งานได้ดี
P_W999

14

ในเวอร์ชัน 7.8 คุณสามารถทำสิ่งนี้ได้โดยไม่ต้องใช้ปลั๊กอิน - แก้ไข -> การทำงานของสาย -> ลบบรรทัดที่ซ้ำกันติดต่อกัน คุณจะต้องเรียงลำดับไฟล์เพื่อวางบรรทัดที่ซ้ำกันตามลำดับก่อนที่จะใช้งานได้ แต่มันจะทำงานเหมือนมีเสน่ห์

ตัวเลือกการเรียงลำดับจะอยู่ภายใต้การแก้ไข -> การทำงานของสาย -> เรียงลำดับตาม ...


7

คุณอาจต้องใช้ปลั๊กอินในการทำเช่นนี้ คุณสามารถลองบรรทัดคำสั่งcc.ddl(เส้นที่ซ้ำกันลบ) ของConyEdit มันเป็นปลั๊กอินตัวแก้ไขข้ามสำหรับโปรแกรมแก้ไขข้อความรวมถึง Notepad ++

ด้วย ConyEdit ทำงานในพื้นหลังทำตามขั้นตอนด้านล่าง:

  1. ป้อนบรรทัดคำสั่งcc.ddlที่ท้ายข้อความ
  2. คัดลอกข้อความและบรรทัดคำสั่ง
  3. วางแล้วคุณจะเห็นสิ่งที่คุณต้องการ

ตัวอย่าง
ป้อนคำอธิบายรูปภาพที่นี่


5

ค้นหานิพจน์ทั่วไป: \b(\w+)\b([\w\W]*)\b\1\b

แทนที่ด้วย: $1$2

กดปุ่มแทนที่จนกว่าจะไม่มีการจับคู่อีกต่อไปสำหรับการแสดงออกปกติในไฟล์ของคุณ


สร้างไฟล์ทดสอบเพื่อลองทำสิ่งนี้ แต่การแสดงออกปกติไม่สามารถทำงานได้อย่างน่าเชื่อถือ
RockPaperLizard

คุณช่วยยกตัวอย่างที่ล้มเหลวเพื่อให้ฉันสามารถปรับปรุงคำตอบของฉันได้ไหม
Hesham Eraqi

4

ไม่มีใครทำงานให้ฉัน

ทางออกคือ:

แทนที่

^(.*)\s+(\r?\n\1\s+)+$

กับ

\1

สร้างไฟล์ทดสอบเพื่อลองทำสิ่งนี้ แต่การแสดงออกปกติไม่สามารถทำงานได้อย่างน่าเชื่อถือ
RockPaperLizard

สำหรับข้อมูลทั้งหมดของฉันมันใช้งานได้ดีฉันลืมว่าโซลูชันของฉันคืออะไร เพิ่มรายละเอียดเพิ่มเติมที่มันล้มเหลวเพื่อให้คนอื่นสามารถปรับปรุง regex นี้
Manohar Reddy Poreddy

ฉันสร้างไฟล์เพื่อให้แต่ละบรรทัดมีจำนวนเต็มระหว่าง 0-999 ตามลำดับโดยบางครั้งอาจมีการซ้ำซ้อน มันไม่ได้ลบรายการที่ซ้ำกันส่วนใหญ่และไม่ได้ลบรายการที่ซ้ำกันที่ไม่มีตามลำดับ
RockPaperLizard

1
โปรดระบุ 2 ตัวอย่างสำหรับการทำงานและสำหรับคนที่ไม่ทำงาน มันจะช่วยใครซักคน
Manohar Reddy Poreddy

1
ทำไม^(.*)\s+(\r?\n\1\s+)+$ไม่^(.*)\s*(\r?\n\1\s*)+$?
Mark Ch

2

ขณะนี้ตัวจัดการปลั๊กอินไม่พร้อมใช้งาน (ไม่ได้มาพร้อมกับการแจกจ่าย) สำหรับ Notepad ++ คุณต้องติดตั้งด้วยตนเอง ( https://github.com/bruderstein/nppPluginManager/releases ) และแม้ว่าคุณจะทำเช่นนั้นปลั๊กอินจำนวนมากจะไม่สามารถใช้งานได้อีกต่อไป (ไม่มี TextFX) ปลั๊กอิน

อาจจะมีปลั๊กอินอื่นที่มีฟังก์ชั่นที่ต้องการ นอกเหนือจากนั้นวิธีเดียวที่จะทำได้ใน Notepad ++ คือการใช้regexพิเศษเพื่อจับคู่และแทนที่ ( Ctrl+ Fแทนที่แท็บ)

แม้ว่าจะมีฟังก์ชั่นมากมายให้ใช้งานผ่านรายการเมนูแก้ไข (การตัด, การลบบรรทัดว่าง, การเรียงลำดับ, การแปลง EOL) ไม่มีการดำเนินการ "ที่ไม่ซ้ำ"

หากคุณมี Windows 10 แล้วคุณสามารถเปิดใช้งานการทุบตี (เพียงแค่พิมพ์อูบุนตูใน Microsoft Store และปฏิบัติตามคำแนะนำในรายละเอียดการติดตั้ง) cat your_file.txt | sort | uniq > your_file_edited.txtและการใช้งาน แน่นอนคุณต้องอยู่ในไดเรกทอรีการทำงานเดียวกับ "your_file.txt" หรืออ้างอิงผ่านเส้นทางของมัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.