แทนที่หลายอินสแตนซ์ของบรรทัดเดียวกันด้วยอินสแตนซ์เดียวเท่านั้น


0

ชื่อกล่าวมันจริง ๆ โดยทั่วไปฉันพยายามรวมไฟล์บันทึกขนาดใหญ่

Notepad ++ และ Regex (ฉันรู้นิดหน่อย) สามารถลบบรรทัดการทำซ้ำเหล่านี้ได้ แต่ปัญหาคือฉันไม่ต้องการให้ลบทั้งหมด ฉันต้องการให้อินสแตนซ์เดียวยังคงอยู่เพื่อรักษาโครงสร้าง / ลำดับของข้อความบันทึก

ฉันตอบคำถามเป็นจำนวนมาก แต่ฉันดูเหมือนจะได้ผลลัพธ์เช่น นี้ . ปัญหาคือว่าฉันไม่ได้แค่พยายามแทนที่หรือยกเว้นบรรทัด

ณ จุดนี้ฉันคิดว่า Regex มีแนวโน้มที่จะตอบคำถามได้มากขึ้น แต่ฉันยังอยู่ในขั้นตอนที่ฉันไม่ทราบว่ามีเครื่องมือใดบ้าง

แก้ไข:

ตัวอย่างของข้อความที่ฉันมีเป็นพัน แต่จะต้องเห็นอย่างใดอย่างหนึ่ง: (ฉันเห็นสิ่งเหล่านี้มากมายเพราะอุปกรณ์ scsi ทุกตัวต้องการชิปในข้อความของตัวเองฉันเพียง แต่ต้องเห็นว่ามันเกิดขึ้น

multipathd[4893]: 3600a098000badf6800005dfe5a8cd2cd: sdie - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005def5a8cd273: sdgq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df05a8cd27b: sdeq - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df55a8cd2ec: sdgw - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005df05a8cd2c2: sdfk - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000bae10c00005dec5a8cd2a3: sdgm - rdac checker reports path is down: ctlr is in startup sequence multipathd[4893]: 3600a098000badf6800005df35a8cd292: sdfo - rdac checker reports path is down: ctlr is in startup sequence

แต่ฉันต้องการเห็นเพียง

rdac checker reports path is down: ctlr is in startup sequence


The title says it, really. ยกเว้นว่าชื่อนั้นเข้าใจผิด บรรทัดที่คุณแสดงไม่มี "บรรทัดเดียวกัน" เป็นบรรทัดที่ไม่ซ้ำกันโดยมีจำนวนอักขระ X ตัวสุดท้าย / คำเท่ากัน คุณอาจได้รับคำตอบที่เป็นประโยชน์หากคุณระบุว่าต้องตรวจสอบส่วนใดของบรรทัดและส่วนใดที่สามารถเพิกเฉยได้
spoko

คำตอบ:


2

หากมีหลายอินสแตนซ์ติดต่อกันคุณสามารถทำได้:

อัปเดตตามคำขอใหม่:

  • Ctrl + H
  • หาอะไร: ^([^-]+- )(.+)(?:\R(?1)\2)+
  • แทนที่ด้วย: $2
  • ตรวจสอบล้อมรอบ
  • ตรวจสอบการแสดงออกปกติ
  • อย่าตรวจสอบ . matches newline
  • แทนที่ทั้งหมด

คำอธิบาย:

^           : beginning of line
  (         : start group 1
    [^-]+-  : 1 or more NOT dash,then a dash and a space
  )         : end group 1
  (         : start group 2
    .+      : 1 or more any character
  )         : end group 2
  (?:       : start non capture group 
    \R      : any kind of linebreak
    (?1)    : same pattern than group 1 (ie. "[^-]+- ")
    \2      : backreference to group 2
  )+        : end non capture group, must appears 1 or more times.

เปลี่ยน:

$2      : content of group 2

ตัวอย่างผลลัพธ์ที่ได้รับ:

rdac checker reports path is down: ctlr is in startup sequence

หากอินสแตนซ์หลายรายการไม่ต่อเนื่องกันคุณควรเขียนสคริปต์ในภาษาสคริปต์ที่คุณชื่นชอบ

นี่คือ perl one-liner ที่ทำงาน:

perl -aE 'chomp;(undef,$x)=split(/-/,$_);next if exists $s{$x};$s{$x}=1;say$x' inputfile

@LeeLemur: ใช่คุณทำได้
Toto

คุณสามารถให้ข้อความตัวอย่างได้หรือไม่ ไม่ได้ทำงานสำหรับฉันและฉันได้เล่นกับมันไม่น้อย
Lee Lemur

@LeeLemur: แก้ไขคำถามของคุณและเพิ่มบางบรรทัดที่แยกจากไฟล์ของคุณและผลลัพธ์ที่คาดหวัง
Toto

1
@LeeLemur: แต่บรรทัดของคุณไม่เหมือนกัน กฎในการลบบรรทัดที่ไม่ต้องการมีอะไรบ้าง
Toto

1
ดังนั้นคุณต้องการที่จะสูญเสียทุกบรรทัดที่ลงท้ายด้วย rdac checker reports path is down: ctlr is in startup sequenceและในสถานที่ของพวกเขาเห็นเพียงวลีนั้นครั้งเดียว? ในกรณีนั้นให้เปลี่ยนข้อความค้นหาของ @ Toto เป็น ^.*(rdac checker reports path is down: ctlr is in startup sequence)(?:\R.*\1)+ และคุณกำลังตั้งค่า สำหรับข้อความแสดงข้อผิดพลาดนี้อย่างน้อยหนึ่งรายการ
spoko
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.