ผมกำลังมองไปที่คำถามนี้แล้วสงสัยว่าผมอาจจะใช้คำตอบของฉันซึ่งใช้
sed
ใช้อย่างหมดจด
POSIX
ex
เคล็ดลับคือในขณะที่sed
ฉันสามารถเปรียบเทียบพื้นที่พักกับพื้นที่รูปแบบเพื่อดูว่าพวกเขาจะเทียบเท่า (กับ
G;/^\(.*\)\n\1$/{do something}
) ฉันรู้วิธีที่จะทำแบบทดสอบex
ไม่
ฉันรู้ว่าในกลุ่มที่ฉันสามารถY
ank บรรทัดแรกแล้วพิมพ์
: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'