sed: ลบสตริงทั้งหมดที่เกิดขึ้นยกเว้นอันแรก


14

ฉันมีไฟล์บันทึกที่มีการประทับเวลาอยู่ในนั้น บางครั้งมีการประทับเวลาหลายครั้งในหนึ่งบรรทัด ตอนนี้ฉันต้องการลบการประทับเวลาทั้งหมดออกจากบรรทัด แต่เก็บครั้งแรก

ฉันจะทำs/pattern//2แต่เพียงเอาเกิดขึ้นที่สองและไม่อนุญาตให้มีสิ่งที่ต้องการseds/pattern//2-

ข้อเสนอแนะใด ๆ


ฉันควรจะบอกว่ามันเป็นกล่องที่ไม่ว่าง ขอโทษสำหรับสิ่งนั้น.
Folkert van Heusden

คำตอบ:


4

ด้วย GNU sed:

sed 's/pattern//2g'

2ระบุว่ารูปแบบที่สองและส่วนที่เหลือทั้งหมดgควรลบ ดังนั้นนี่จะเก็บอันแรกไว้


1
Cygwin ใดที่มี (พอร์ตซึ่งเห็นได้ชัด) และ MacOS ไม่มี Achh! วิธีนี้มีความสง่างามกว่ามาก
r_alex_hall

7

สิ่งนี้จะใช้งานได้ (แทนที่ _ ด้วยสิ่งอื่นที่ควรขัดแย้งกับบันทึกของคุณ):

sed -e 's/pattern/_&/1' -e 's/\([^_]\)pattern//g' -e 's/_\(pattern\)/\1/'

1
\nถ้าคุณเคยต้องการตัวคั่นที่ไม่ซ้ำกันใช้
mikeserv

5
sed -e ':begin;s/pattern//2;t begin'

หรือไม่มี sedo ไป:

sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//;s/pattern//g;H;g;s/\n.*\n//'

โซลูชันทั่วไปที่จะลบออกจากตำแหน่งที่ n (3 ตัวอย่าง) คือ:

sed -e ':begin;s/pattern//4;t begin'
sed -e 's/\(pattern\)/\1\n/;h;s/.*\n//3;s/pattern//g;H;g;s/\n.*\n//'

1

ความแตกต่างเล็กน้อยในคำตอบของ @ jillagre (แก้ไขเพื่อความทนทาน)อาจมีลักษณะดังนี้:

sed 's/p\(attern\)/p\n\1/;s///g;s/\n//'

... แต่ในบางseds คุณอาจจำเป็นต้องแทนที่nในด้านขวาของs///คำสั่ง ubstitution แรกด้วย\nอักขระ ewline ที่แท้จริง

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