ฉันจะแทรกบรรทัดว่างระหว่างทุกบรรทัดที่ไม่ว่างได้อย่างไร
เช่น. จาก
line 1
line 2
line 3
line 4
line 5
ถึง
line 1
line 2
line 3
line 4
line 5
ฉันจะแทรกบรรทัดว่างระหว่างทุกบรรทัดที่ไม่ว่างได้อย่างไร
เช่น. จาก
line 1
line 2
line 3
line 4
line 5
ถึง
line 1
line 2
line 3
line 4
line 5
คำตอบ:
Vim's: g คำสั่งถูกออกแบบมาสำหรับงานประเภทนี้ เรียกใช้การกระทำเดียวในทุกบรรทัดที่ตรงกับรูปแบบเฉพาะ นี่คือคำตอบของฉัน:
:g/.\n\n\@!/norm o
/.\n\n\@!/
การใช้รูปแบบที่ฉันเป็น แบ่งออกเป็นชิ้นส่วนของมัน:
.
จับคู่อักขระใด ๆ ในบรรทัด (ใช้เพื่อละทิ้งบรรทัดว่างใด ๆ ที่มีอยู่ทันทีจากการพิจารณา)\n
จับคู่ \ n ตัวเดียวที่ส่วนท้ายของอักขระด้านบน\n\@!
ไม่สามารถแข่งขันได้หากมีอีก \ n ทันทีหลัง \ n ก่อนหน้านี้(ตรวจสอบ:h E59
ข้อมูลเพิ่มเติมเกี่ยวกับ\@!
และตัวระบุการจับคู่ที่คล้ายกันในนิพจน์ทั่วไป - มีอีกสองสามรายการด้วย!)
ดังนั้น regex ของคำสั่ง: g ตอนนี้ได้เลือกทุกบรรทัดที่ไม่ว่างซึ่งถูกยกเลิกโดยบรรทัดใหม่เดียวและที่ไม่ได้ตามด้วยบรรทัดว่าง
หลังจากที่รูปแบบใน:g
คำสั่งมาพร้อมคำสั่งให้ทำงานบนเส้นที่ตรงกัน ในกรณีนี้ฉันได้บอกให้รันคำสั่งโหมดปกติ (ตัวย่อnorm
) และคำสั่งที่จะเรียกใช้นั้นเรียบง่ายo
ซึ่งแทรกบรรทัดว่างด้านล่างบรรทัดปัจจุบัน
เมื่อรวมกันแล้วคำสั่งจะค้นหาทุกบรรทัดที่ไม่มีบรรทัดว่างข้างใต้และเพิ่มหนึ่งบรรทัด และนั่นคือทั้งหมดที่มีให้มัน! คุณอาจต้องการตรวจสอบบทความPower of G ของ vim wiki สำหรับสิ่งแฟนซีเพิ่มเติมที่คุณสามารถทำได้:g
(และเป็นน้องสาวด้านลบ:v
) - มันเป็นหนึ่งในคำสั่งที่มีประโยชน์อย่างน่าอัศจรรย์ที่คุณจะไว้ใจได้ในไม่ช้า ซึ่งไม่มี
:%s/$/
แล้วตีตีแล้ว^V
Enter
:%s/$/<C-V><CR><CR>
(ใช้การเข้ารหัส vim-folk ทั่วไปของ keypresses) วิธีการนั้นจะเพิ่มบรรทัดใหม่หลังจากแต่ละบรรทัด นั่นคือบรรทัดที่คั่นด้วยช่องว่างแล้ว (ดูบรรทัดที่ 3 -> บรรทัดที่ 4 ในข้อความตัวอย่าง) ปิดท้ายรับบรรทัดว่างพิเศษ คำถามเดิมคือหลีกเลี่ยงการเพิ่มบรรทัดว่างที่มีอยู่แล้วในข้อความเริ่มต้น
เมื่อฉันทดสอบการค้นหาทั่วโลกของ @ NeilForester และแทนที่คำตอบฉันพบว่ามันพลาดทุกวินาทีที่มีการแทนที่ในบรรทัดที่ไม่ว่างต่อเนื่องหากบรรทัดมีอักขระเพียงตัวเดียวในแต่ละตัว สิ่งนี้ดูเหมือนจะเป็นเพราะรูปแบบเริ่มต้นที่จะจับคู่ในแต่ละโอกาสหลังจากตัวละครตัวสุดท้ายที่มันตรงกับโอกาสก่อนหน้า
การใช้ lookbehind และ lookahead แก้ปัญหานี้และทำให้ regex สั้นลงเช่นกัน:
:%s/\n\@<!\n\n\@!/\r\r/g
\n\@<!\n
หมายความว่าการกระจายตัวใด ๆ ที่ไม่ถูกต้องหลังจากการกระจายอีกครั้งนั้นถูกต้องหรือไม่ แต่ฉันไม่เข้าใจความ\n\@!
หมาย ฉันต้องการที่จะเข้าใจมันดังนั้นฉันสามารถเรียนรู้และนำไปใช้กับรูปแบบการค้นหาอื่น ๆ :)
\n\@<!\n
หมายถึงการใด ๆ ที่ไม่ได้ติดตามอีกครั้งในการแตกครั้งเดียว \n\@!
จับคู่กับความกว้างเป็นศูนย์หากอะตอมก่อนหน้า (เช่น\n
) ไม่ตรงกับก่อนหน้าสิ่งต่อไปนี้ ลอง:help \@<!
ดูเอกสารประกอบในส่วนนี้เป็นกลุ่ม I
อีกวิธีหนึ่ง:
%s/\(.\)\n\(.\)/\1\r\r\2/
ซึ่งหมายความว่า,
\(.\) match and capture a non-newline character,
\n match a newline
\(.\) match and capture a non-newline character
แทนที่ด้วย: การจับภาพครั้งแรก, การขึ้นบรรทัดใหม่สองครั้งและการจับภาพที่สอง
ตัวอย่างเช่นline1\nLine2
ผลในและ\1 = 1
\2 = L
ถูกต้องฉันถ้าฉันผิด ฉันเชื่อว่าคุณใช้ตัวอักษร k เมื่ออยู่ในโหมดคำสั่งเพื่อเลื่อนลงบรรทัด จากนั้นเข้าสู่โหมดแทรกและเพิ่มบรรทัดถัดไป ทำซ้ำตามความจำเป็น? หวังว่านี่จะช่วยได้!
k
เลื่อนขึ้นบรรทัด j
เลื่อนลงบรรทัด
/[^\n]\n[^\n]
:map <F2> no<esc><F2>
<F2>
จากนั้นกด ที่จะค้นหาสองบรรทัดที่ไม่ว่างต่อเนื่องกันแล้วเพิ่มบรรทัดระหว่างบรรทัดนั้นซ้ำ ๆ
แก้ไข:
ต่อไปนี้เป็นวิธีทางเลือกในการค้นหาทั่วโลกและแทนที่:
:%s/\([^\n]\)\n\([^\n]\)/\1\r\r\2/g
ลองใช้คำสั่งนี้ ( 16
ตัวอักษร):
:%!sed G|cat -s
ฉันไม่รู้ว่าไฟล์ของคุณนานแค่ไหน แต่วิธีที่ง่ายที่สุดวิธีหนึ่งคือพิมพ์o
ในโหมดคำสั่ง .
และในบรรทัดถัดไป นี่อาจเป็นโหลดไปยังแมโครอย่างง่าย
:%norm o
o
+1