การลบข้อความระหว่างสองสตริงที่ระบุ


10

ฉันมีไฟล์ดังนี้:

mime PI Name: ISHO SUCCESS RATE RT, Value: 95.663826
scr  PI Name: RRC Access Failures due to UU, Value: 0.13394141
prog PI Name: RRC Access Failures due to UU, Value: 0.16077702
sch PI Name: RRC Access Failures due to UU, Value: 0.11781933

ฉันต้องการที่จะลบข้อความจนถึงPI Value:ฉันเหนื่อย

sed '/<PI>/,/<\/Value:>/d' 

ความช่วยเหลือใด ๆ

คำตอบ:


20

แทนที่ทุกอย่างจากPIเป็นValue:สตริงว่าง:

sed 's/PI.*Value://'

10
มันจะใช้งานได้หรือไม่PIและValue:เกิดขึ้นกับสายต่างกันหรือไม่?
Brian Fitzpatrick

6

การใช้dคำสั่งในsedจะลบทั้งบรรทัด นอกจากนี้ผมไม่แน่ใจว่าทำไมคุณกำลังใช้และ< >บางทีคุณอาจกำลังสับสนพวกเขาด้วย\<และ\>ที่grepใช้ในการแสดงว่าขอบเขตของคำ? ในกรณีนี้คุณควรรู้ว่าสิ่งsedนี้ใช้\bสำหรับขอบเขตของคำทั้งสองประเภท (เริ่มต้นและสิ้นสุด) ดังนั้นคุณสามารถเขียนสิ่งนี้:

sed -i 's/\bPI\b.*\bValue:\b//' your_file

เพื่อความทนทานเป็นพิเศษฉันจะใช้perlสำหรับการหาปริมาณที่ขี้เกียจ.เพื่อให้คุณลบข้อความระหว่างการเกิดPIครั้งแรกกับการเกิดครั้งแรกValue:เท่านั้น แน่นอนมันทั้งหมดขึ้นอยู่กับกรณีการใช้งานของคุณ

perl -pi -e 's{ \b PI \b .*? \b Value: \b}{}x' your_file

1

ใช้รหัสด้านล่างนี้เพื่อลบหลายบรรทัดระหว่างรูปแบบ (รวมถึงบรรทัดที่มีรูปแบบ):

sed "/PI/,/Value:/d" your_file

หากคุณต้องการแก้ไข your_file โดยตรง:

sed -i "/PI/,/Value:/d" your_file

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