ผมกำลังมองไปที่คำถามนี้แล้วสงสัยว่าผมอาจจะใช้คำตอบของฉันซึ่งใช้
sedใช้อย่างหมดจด
POSIX
ex
เคล็ดลับคือในขณะที่sedฉันสามารถเปรียบเทียบพื้นที่พักกับพื้นที่รูปแบบเพื่อดูว่าพวกเขาจะเทียบเท่า (กับ
G;/^\(.*\)\n\1$/{do something}) ฉันรู้วิธีที่จะทำแบบทดสอบexไม่
ฉันรู้ว่าในกลุ่มที่ฉันสามารถYank บรรทัดแรกแล้วพิมพ์
:2,$g/<C-r>0/dไปเกือบจะทำในสิ่งที่ผมระบุ แต่ถ้าบรรทัดแรกมีอะไร แต่ข้อความตัวเลขและตรงไปตรงมามากนี้จะกลายเป็นไม่แน่นอนแน่นอนเนื่องจากสายจะถูกทิ้งในเป็น
regexไม่ใช่แค่สตริงสำหรับการเปรียบเทียบ (และหากบรรทัดแรกมีเครื่องหมายทับหน้าส่วนที่เหลือของบรรทัดจะถูกตีความเป็นคำสั่ง!)
ดังนั้นหากฉันต้องการลบทุกบรรทัดในmyfileที่เหมือนกันกับบรรทัดแรก - แต่ไม่ลบบรรทัดแรก - ฉันจะทำเช่นนั้นได้exอย่างไรโดยใช้? สำหรับเรื่องนั้นฉันจะใช้มันได้viอย่างไร
มีวิธี POSIX ในการลบบรรทัดหรือไม่หากตรงกับอีกบรรทัดหนึ่ง?
บางทีบางอย่างเช่นไวยากรณ์ในจินตนาการ:
:2,$g/**lines equal to "0**/d
sedเป็นตัวกรองจากภายในexและเรียกใช้sedคำตอบทั้งหมดของฉันในบัฟเฟอร์ทั้งหมด ... ซึ่งจะทำงานแน่นอน (และแตกต่างจากแบบพกพาจริง ๆsed -i)
<C-r>0ดีมาก ฉันไม่แน่ใจว่าคุณทำได้ดีกว่าด้วยคำสั่ง Ex เพียงอย่างเดียวเพราะคุณต้องปกป้องตัวละครพิเศษ หากไม่มีข้อ จำกัด ที่เป็นไปตาม POSIX ฉันคิดว่าคุณจะใช้สวิตช์ที่น่าสมเพชมาก\Vและจากนั้นคุณจะป้องกันแบ็กสแลช (เพราะมันยังคงความหมายพิเศษไว้ด้วย\V) กับescape()ฟังก์ชั่นที่อาร์กิวเมนต์ 2 คือสตริงที่มีอักขระทั้งหมดที่คุณต้องการหลบหนี .
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'หรือคุณสามารถใช้อักขระอื่นสำหรับตัวคั่นรูปแบบเหมือนเครื่องหมายอัฒภาค ในกรณีนี้คุณไม่จำเป็นต้องปกป้องเครื่องหมายสแลชในรูปแบบ มันจะให้อะไรเช่น::execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sedดีมาก ด้วย Vim คุณมักจะมอบหมายงานพิเศษบางอย่างให้กับโปรแกรมอื่น ๆ และsedอาจเป็นตัวอย่างที่ดีของสิ่งนั้น อย่างไรก็ตามคุณไม่จำเป็นต้องใช้sedบัฟเฟอร์ทั้งหมด หากคุณต้องการเรียกใช้เฉพาะในส่วนของบัฟเฟอร์คุณสามารถกำหนดช่วงได้ ตัวอย่างเช่นถ้าคุณต้องการที่จะกรองเพียงเส้นแบ่งระหว่าง 50 และ 100 :50,100!<your sed command>คุณสามารถพิมพ์:
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'