ฉันจะลบบรรทัดที่ซ้ำกันใน Visual Studio Code ได้อย่างไร


118

สมมติว่าคุณมีข้อความต่อไปนี้:

abc
123
abc
456
789
abc
abc

ฉันต้องการลบบรรทัด "abc" ทั้งหมดและเก็บไว้เพียงบรรทัดเดียว ฉันไม่คิดจะเรียงลำดับ ผลลัพธ์ควรเป็นดังนี้:

abc
123
456
789

คำตอบ:


224

ถ้าลำดับของบรรทัดไม่สำคัญ

จัดเรียงบรรทัดตามตัวอักษรหากยังไม่ได้ดำเนินการตามขั้นตอนเหล่านี้:
(ตามคำถามที่เกี่ยวข้องนี้: ฉันจะค้นหาและลบบรรทัดที่ซ้ำกันออกจากไฟล์โดยใช้นิพจน์ทั่วไปได้อย่างไร )

  1. Control+F

  2. สลับ "โหมดแทนที่"

  3. สลับ "ใช้นิพจน์ทั่วไป" (ไอคอนที่มี .*สัญลักษณ์)

  4. ในการค้นหาพิมพ์^(.*)(\n\1)+$

  5. ใน " แทนที่ด้วย " ให้พิมพ์$1

  6. คลิก ปุ่มแทนที่ทั้งหมด ("แทนที่ทั้งหมด")

ถ้าเรียงลำดับบรรทัด มีความสำคัญจนคุณไม่สามารถจัดเรียงได้

ในกรณีนี้ให้หันไปใช้โซลูชันภายนอก VS Code (ดูที่นี่ ) หรือ - หากเอกสารของคุณมีขนาดไม่ใหญ่มากและคุณไม่รังเกียจที่จะส่งปุ่ม Replace All ให้ทำตามขั้นตอนก่อนหน้านี้ แต่ในขั้นตอนที่ 4 และ 5 ป้อนสิ่งเหล่านี้:
(ขึ้นอยู่กับการลบบรรทัดที่ซ้ำกันโดยไม่ต้องเรียงลำดับ )

ข้อควรระวัง: บล็อกไฟล์ที่มีบรรทัดมากเกินไป (1,000+); อาจทำให้ VS Code ขัดข้อง; อาจแนะนำบรรทัดว่างในบางกรณี

  • ค้นหา :((^[^\S$]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\n)?

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

และจากนั้นคลิกที่ปุ่ม "แทนที่ทั้งหมด" หลายครั้งตามที่มีการเกิดขึ้นซ้ำ

คุณจะรู้ว่าเพียงพอแล้วเมื่อจำนวนบรรทัดหยุดลดลงเมื่อคุณคลิกปุ่ม ไปที่บรรทัดสุดท้ายของเอกสารเพื่อจับตาดูสิ่งนั้น


4
((^[^\S\r\n]*?(?=\S)(?:.*)+$)[\S\s]*?)^\2$(?:\r?\n)?ทำให้ vscode ของฉันพัง .... ฉันค้นหาในไฟล์เดียว 229 บรรทัด :(
Hickory420

@ Hickory420 ฉันทดสอบในเครื่องของฉันด้วย 1,000 บรรทัด (ความยาว 20 ตัวสุ่ม) และไม่มีข้อผิดพลาด แต่แท้จริงแล้วบล็อกเธรดที่มีการโหลด cpu 100% เป็นเวลาสองสามวินาทีในแต่ละรอบ ใช่นี่แทบจะไม่เหมาะสำหรับไฟล์ขนาดใหญ่
Marc.2377

ขอบคุณสำหรับสิ่งนี้. คุณช่วยอธิบาย regex ^(.*)(\n\1)+$ได้ไหม หลังจากลบแถวที่ซ้ำกันฉันต้องการดูแถวทั้งหมดที่มีคอลัมน์แรกที่ซ้ำกันใน csv และต้องการแก้ไข regex
Urvah Shabbir

1
ว้าวฉันรู้สึกว่าฉันค่อนข้างเก่งใน regex และมันยังทำให้ฉันนึกถึงคำตอบที่ดี !!
electrovir

@UrvahShabbir คำอธิบายสำหรับชิ้นส่วนของ regex ที่จะได้รับในการเชื่อมโยง Q & A ของฉันแตกต่างกันตรงที่\r?บิตจากคำตอบอื่นไม่จำเป็นจริงๆ
Marc.2377

66

นี่คือส่วนขยายที่น่าสนใจมาก: Transformer

คุณสมบัติ:

  • เส้นเฉพาะ
  • เส้นเฉพาะเป็นเอกสารใหม่
  • เส้นกรอง
  • กรองบรรทัดเป็นเอกสารใหม่
  • เรียงลำดับบรรทัด
  • เรียงลำดับเส้นตามความยาว
  • จัดแนวไปยังเคอร์เซอร์
  • จัดแนว CSV
  • CSV ขนาดกะทัดรัด
  • คัดลอกไปยังเอกสารใหม่
  • เลือกเส้น
  • บรรทัดเป็น JSON
  • ตัดแต่งเส้น
  • นับบรรทัดที่ซ้ำกันเป็นเอกสารใหม่
  • มาโคร

สำหรับการลบบรรทัดที่ซ้ำกัน:

  • ลบบรรทัดที่ซ้ำกันออกจากเอกสาร

  • ดำเนินการกับการเลือกหรือบล็อกปัจจุบันหากไม่มีการเลือก

ฉันไม่ได้เล่นกับมันมากนักนอกจากคำสั่ง "Unique Lines" แต่ดูเหมือนว่าทำได้ดีทีเดียว (รวมถึงการพยายามใช้เครื่องบันทึกมาโครด้วย!)


26

เพื่อเพิ่มในการตอบกลับของ @ Marc.2377

หากคำสั่งนั้นสำคัญและคุณไม่สนใจว่าคุณจะเก็บบรรทัดสุดท้ายที่ซ้ำกันเพียงแค่ค้นหา regexp ต่อไปนี้หากคุณต้องการลบเฉพาะบรรทัดที่ซ้ำกันที่ไม่ว่างเปล่า

^(.+\n)(?=(?:.*\n)*?\1)

หากคุณต้องการลบบรรทัดว่างที่ซ้ำกันให้ใช้*แทน+

^(.*\n)(?=(?:.*\n)*?\1)

และแทนที่ด้วยอะไรเลย

ภาพหน้าจอของช่องค้นหาและแทนที่แบบเต็ม

สิ่งนี้จะใช้เวลาเป็นบรรทัดและพยายามหาบรรทัดข้างหน้าอีก (อาจจะเป็น 0) ตามด้วยบรรทัดเดียวกันกับที่ใช้ มันจะลบเส้นที่ถ่ายออก

นี่เป็นเพียงภาพเดียว ไม่จำเป็นต้องสแปมปุ่มแทนที่


รวบรัดอย่างสวยงาม
angus l

4
ดี. ขอแนะนำ^(.+\n)(?=(?:.*\n)*?\1)แทนเนื่องจาก regex ของคุณลบบรรทัดว่างที่ไม่คาดคิด โหวตแล้ว
Marc.2377

จับดี ... OTOH: บรรทัดว่างที่ซ้ำกันนอกจากนี้ยังมีรายการที่ซ้ำกัน;)
Skeeve

1
@Skeeve มาเถอะขอบคุณสำหรับคำตอบที่เป็นประโยชน์และทั้งหมดเพื่อชุมชนที่ดีขึ้น :)
Zaman

1
xxx(?=…)เป็นการจับคู่แบบ Lookahead ดังนั้นจึงทำให้แน่ใจว่าสิ่งที่ตามหลัง "xxx" จะตรงกับ "…" แต่จะไม่เลื่อนการค้นหา (?:…)เป็นเพียงวงเล็บที่ไม่นับในจำนวนวงเล็บ .*\nเป็นรูปแบบสำหรับเส้น (อาจว่างเปล่า) *หมายความว่าอาจมีหลายบรรทัดแม้ว่าจะไม่มีเลยก็ตาม ?หลังจากเครื่องหมายดอกจัน ( *) หมายความว่าเราต้องการให้เป็นไม่กี่บรรทัดที่เป็นไปได้ ในฐานะที่เป็น\1ดังต่อไปนี้การแสดงออกนี้ผลที่ได้คือการที่เรามองไปข้างหน้าสำหรับทุกสายที่ไม่ตรงกับจนกว่าเราจะพบว่าการจับคู่บรรทัด\1 \1ฉันหวังว่านี่จะทำให้ชัดเจน
Skeeve

22

ฉันเพิ่งมีปัญหาเดียวกันและพบแพ็คเกจ Visual Studio Code "เรียงลำดับบรรทัด" ดูตลาด Visual Studio Code สำหรับรายละเอียด (เช่นเรียงลำดับบรรทัด )

แพคเกจนี้มีตัวเลือก "การเรียงลำดับบรรทัด (ไม่ซ้ำกัน)" ซึ่งทำเพื่อฉัน ดูแลช่องว่างสีขาวที่จุดเริ่มต้น / จุดสิ้นสุดของบรรทัด มีผลต่อการพิจารณาว่าเส้นไม่ซ้ำกันหรือไม่


marketplace.visualstudio.com/…ก็ควรใช้งานได้เช่นกัน
kcpr

1
ดูเหมือนว่าส่วนขยายจะไม่สามารถลบรายการที่ซ้ำกันได้อีกต่อไป เมื่อรวมเข้ากับคำตอบโดย @ Marc-2377 ดูเหมือนจะเป็นเคล็ดลับสำหรับฉัน
Dan Atkinson

12

ติดตั้งส่วนขยายDupCheckerตีF1และพิมพ์ "Check Duplicates"

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


11

ลองค้นหาและแทนที่ด้วยการแสดงออกปกติ

  • หา: ^(.+)((?:\r?\n.*)*)(?:\r?\n\1)$

  • แทนที่: $1$2

เป็นไปได้ที่จะแนะนำความแปรปรวนบางอย่างในกลุ่มแรก


-3

ไม่ได้อยู่ใน Visual Studio Code แต่ถ้าใช้งานได้ก็ใช้งานได้

  1. เปิดสเปรดชีต Excel ใหม่
  2. วางข้อมูลลงในคอลัมน์
  3. ไปที่แท็บข้อมูล
  4. เลือกคอลัมน์ข้อมูล (ถ้าคุณยังไม่ได้ทำ)
  5. คลิกRemove Duplicates (อยู่ตรงกลางแถบ)
  6. คลิกOKเพื่อลบรายการที่ซ้ำกัน

ไม่ใช่คำตอบที่ดีที่สุดตามที่คุณระบุ Visual Studio Code แต่อย่างที่บอก: ถ้ามันใช้ได้ก็ใช้งานได้ :)


คุณสามารถทำให้มีความเกี่ยวข้องมากขึ้นโดยจัดเตรียมสคริปต์ที่สามารถเรียกได้โดยตรงจาก Visual Studio Code ตามลำดับขั้นตอนนี้จะทำให้กระบวนการนี้เป็นไปโดยอัตโนมัติ ฉันไม่รู้ว่าเป็นไปได้หรือเปล่า แต่เป็นสคริปต์ที่จะเรียกใช้ Excel ผ่านอินเทอร์เฟซ COM ที่เปิดเผย สิ่งนี้จะทำให้คำตอบนี้มีคุณค่ามากขึ้นเนื่องจากเป็นตัวอย่างของการใช้ประโยชน์จากแอปพลิเคชันอื่น ๆ เพื่อทำสิ่งที่เป็นระเบียบ
Peter Mortensen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.