ลบบรรทัดที่มีรูปแบบที่ตรงกันหลังจากบรรทัดแรกด้วย sed


2

ฉันต้องการลบทุกบรรทัดที่มีรูปแบบหลังจากบรรทัดแรก (รูปแบบคือ/^country\t/) ฉันสามารถลบทุกครั้งที่เกิดขึ้นด้วยsed '/^country\t/d' in.txt > out.txtแต่ฉันต้องการที่จะให้เกิดขึ้นครั้งแรกในบรรทัดแรก

เรื่องกลับมาที่ฉันมีไดเรกทอรีของแฟ้มที่คั่นด้วยแท็บที่มีส่วนหัวและฉัน concatenate catไฟล์เหล่านี้ด้วย ฉันต้องการลบส่วนหัวพิเศษ

ใน Vim ฉันสามารถทำอะไรบางอย่างได้: 2,$g/^country\t/dแต่ฉันไม่สามารถหาทางแก้ปัญหาได้ เมื่อฉันพยายามที่ฉันได้รับข้อผิดพลาดsed '2,$ /^country\t/d in.txt > out.txtunknown command: /

ขอบคุณ!

คำตอบ:


1

ไม่มีวิธีโดยตรง แต่นี่เป็นวิธีแก้ปัญหา:

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt

2

สิ่งนี้อาจใช้ได้กับคุณ:

sed '1b;/^country\t/d' in.txt > out.txt

หรือ

sed '1!{/^country\t/d}' in.txt > out.txt

0
sed 's/[^country]*//2' <old >new

สิ่งนี้ควรเปลี่ยนอินสแตนซ์ทั้งหมดของประเทศยกเว้นกรณีแรก (หากคุณมีสองบรรทัดแรกเท่านั้นจะมีการเก็บรักษาไว้แรก)


ขอบคุณ แต่ฉันต้องการจะลบทั้งบรรทัด เป็นทางเลือกเดียวของฉันโดยใช้s///gโครงสร้างและการทำบางสิ่งบางอย่างเช่นรูปแบบ/^country.*\n/?
Richard Herron


+1 ลิงค์ดี! (ฉันพบว่าในการค้นหาของฉัน แต่ไม่สามารถแฮ็ค @ johnshen64 ร่วมกันได้)
Richard Herron

0
sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

การดำเนินการนี้จะลบทุกบรรทัดที่ตรงกันหลังจากบรรทัดแรกที่ตรงกัน ความเห็น:

/ pattern / - รูปแบบการจับคู่

{x - ถ้าตรงกับข้างต้นให้สลับรูปแบบและพักบัฟเฟอร์

; / pattern /! {x; h; b;} - ตอนนี้ทดสอบบัฟเฟอร์รูปแบบ (ตอนนี้มันจะว่างเปล่าในการแข่งขันครั้งแรก) และถ้าไม่ได้! มีรูปแบบอยู่แล้วจากนั้นสลับ 'x' รูปแบบและพักบัฟเฟอร์อีกครั้งจากนั้นคัดลอกบัฟเฟอร์รูปแบบลงในบัฟเฟอร์พัก 'h' และสาขา 'b' ไปยังจุดสิ้นสุดของสคริปต์และโหลดบรรทัดถัดไป

; x; d} - บิตนี้จะได้รับการดำเนินการหากรูปแบบที่ผ่านการคัดค้านตรงกับขั้นตอนก่อนหน้านี้ล้มเหลว - เช่นบัฟเฟอร์รูปแบบตรงกับรูปแบบของคุณ ในกรณีนี้ให้สลับบัฟเฟอร์พักและรูปแบบกลับเป็น 'x' อีกครั้งและลบ 'd' บรรทัด


0

หาก / pattern / ไม่ตรงกับบรรทัดว่างให้ใช้ " holdช่องว่างนั้นเริ่มต้นเป็นบรรทัดว่าง" เพื่อทดสอบคู่แรก:

รักษาบรรทัดแรก:

sed '/pattern/ {x; /^$/!d; g;}' file

วางบรรทัดแรก:

sed '/pattern/ x' file

แก้ไขบรรทัดแรกเท่านั้น:

sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file

แก้ไขบรรทัดต่อไปนี้เท่านั้น:

sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file

PS: $'\n'(ไม่ใช่ก;) ติดตามtหรือbทำให้ bsd มีความสุข

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