ทำไมต้องขึ้นบรรทัดใหม่สำหรับ Vim


254

จากคำถามจะแทนที่อักขระสำหรับบรรทัดใหม่ใน Vim ได้อย่างไร . คุณต้องใช้ \ r เมื่อแทนที่ข้อความสำหรับการขึ้นบรรทัดใหม่เช่นนี้

:%s/%/\r/g

แต่เมื่อแทนที่บรรทัดและบรรทัดใหม่สำหรับอักขระคุณสามารถทำสิ่งต่อไปนี้:

:%s/\n/%/g 

ส่วนใดของเอกสารคู่มือพฤติกรรมเหล่านี้และเหตุผลที่อยู่เบื้องหลังพวกเขาคืออะไร


1
อะไรคือสิ่งที่%สำหรับเมื่อค้นหาและแทนที่?
QED

7
@qed: โดยค่าเริ่มต้น:sจะใช้การทดแทนกับบรรทัดปัจจุบันเท่านั้น :%sทำให้มันอยู่ที่ไฟล์ทั้งหมด มากขึ้น
c24w

3
+ c24w ฉันคิดว่าเขาอ้างถึง '%' ระหว่างเครื่องหมายทับ, ตัวอย่างแรกที่ '%' อยู่ในตำแหน่งการค้นหาและในตำแหน่งแทนที่ในตัวอย่างที่สอง แต่ @qed เพื่อตอบคำถามของคุณนั่นคือ '% ถูกจับคู่อย่างแท้จริง
RastaJedi

คำตอบ:


155

จากกลุ่มเอกสารในรูปแบบ :

\r ตรงกับ <CR>

\n ตรงกับจุดสิ้นสุดของบรรทัด - เมื่อจับคู่ในสตริงแทนข้อความบัฟเฟอร์จะมีการจับคู่อักขระขึ้นบรรทัดใหม่ตามตัวอักษร


41
สำหรับฉันจุดที่สับสนคือ \ r และ \ n หมายถึงสิ่งต่าง ๆ เมื่อใช้คือรูปแบบการค้นหาและรูปแบบการแทนที่
dlamblin

3
@dambamblin Yup! ดูคำตอบของฉัน :)
การชดเชย จำกัด

207

จากhttp://vim.wikia.com/wiki/Search_and_replace :

เมื่อค้นหา

...

\nคือบรรทัดใหม่\rคือCR(carriage return = Ctrl-M= ^M)

เมื่อเปลี่ยน

...

\rขึ้นบรรทัดใหม่\nเป็นไบต์ว่าง ( 0x00)


6
คำตอบนี้ช่วยฉันได้มากที่สุด นอกจากนี้สำหรับข้อมูลเพิ่มเติม:h :s%โดยเฉพาะย่อหน้าสุดท้าย (ผ่าน:h :s)
dipnlik

113

อีกแง่มุมหนึ่งของเรื่องนี้ก็คือ\0ซึ่งเป็นโมฆะตามเนื้อผ้าถูกนำมาใช้ s//\0/เพื่อหมายถึง "รูปแบบการจับคู่ทั้งหมด" (ซึ่งโดยวิธีคือซ้ำซ้อนกับและนานกว่า&)

  • ดังนั้นคุณไม่สามารถใช้\0หมายถึงNULLดังนั้นคุณใช้\n
  • ดังนั้นคุณจึงไม่สามารถใช้\nเพื่อหมายถึงเพื่อให้คุณใช้\n\r
  • ดังนั้นคุณไม่สามารถใช้\rหมายถึง\rแต่ฉันไม่รู้ว่าใครต้องการเพิ่มอักขระที่เกี่ยวกับวัตถุประสงค์

-☈


1
จุดดี! ดังนั้นนี่คือแฮ็ค \ 0 - การอ้างอิงย้อนกลับไปยังกลุ่มที่ซ้อนกัน 0 - regexp ทั้งหมด นี่เป็นคำตอบที่ดีมาก แต่มันทำให้ฉันผิดหวังที่ฉันไม่สามารถใช้ \ r แทน ... (ความหมาย: insert # (13) ตัวอย่างเช่นในไฟล์ "ปกติ" (== unix EOLs)
Tomasz Gandor

3
ตกลงคำตอบอยู่ใน Vim docs เพียงแค่หลบหนี \ ^ M หรือ \ <CR> ด้วยแบ็กสแลชปกติ ดี ----- <CR> แยกบรรทัดเป็นสองจุด ณ จุดนี้ (พิมพ์ <CR> เป็น CTRL-V <Enter>) s <CR> \ r idem -------- s / \ r \ < CR> แทรก carriage-return (CTRL-M) (พิมพ์ <CR> เป็น CTRL-V <Enter>) s / \ <CR>
Tomasz Gandor

16
"แง่มุมอื่น"? คุณเจียมเนื้อเจียมตัวเกินไป! การอธิบายอย่างแม่นยำว่าเมื่อเกิดเหตุการณ์นี้ขึ้นจะทำให้ได้คำตอบที่เหนือกว่าสำหรับทุกคนเพียงแค่บอกว่าจะหลีกเลี่ยงมันได้อย่างไร +1
underscore_d

นี่เป็นข้อมูลเชิงลึกที่ยอดเยี่ยมอย่างแท้จริงว่าทำไม\nมีความหมายแตกต่างกันในการค้นหาและแทนที่รูปแบบ คำตอบที่ยอดเยี่ยม
ZeroKnight

47

:help NL-used-for-Nul

รายละเอียดทางเทคนิค:

<Nul>อักขระในไฟล์จะถูกเก็บไว้<NL>ในหน่วยความจำ ในจอแสดงผลจะแสดงเป็น " ^@" การแปลเสร็จสิ้นเมื่ออ่านและเขียนไฟล์ หากต้องการจับคู่ a <Nul>กับรูปแบบการค้นหาคุณสามารถป้อนCTRL- @หรือ " CTRL-V 000" นี่อาจเป็นสิ่งที่คุณคาดหวัง ภายในตัวละครจะถูกแทนที่ด้วย<NL>ในรูปแบบการค้นหา สิ่งที่ผิดปกติคือการพิมพ์CTRL-V CTRL-Jยังแทรก a <NL>ดังนั้นจึงค้นหา a <Nul> ในไฟล์ {Vi ไม่สามารถจัดการ<Nul>อักขระในไฟล์ได้เลย}



10

ก่อนอื่นให้เปิด:h :sเพื่อดูส่วน "4.2 Substit" ของเอกสารเกี่ยวกับ "Change" นี่คือสิ่งที่คำสั่งยอมรับ:

:[range]s[ubstitute]/{pattern}/{string}/[flags] [count]

สังเกตคำอธิบายเกี่ยวกับpatternและstring

สำหรับดู{pattern} สามารถเป็นสตริงตัวอักษรหรือสิ่งที่ พิเศษ เห็นไหม|pattern|
{string}
|sub-replace-special|

ตอนนี้คุณรู้แล้วว่ารูปแบบการค้นหาและรูปแบบการแทนที่เป็นไปตามกฎที่แตกต่างกัน หากคุณไปที่ลิงก์ไปยัง|pattern|มันจะพาคุณไปยังส่วนที่อธิบายรูปแบบ regexp ทั้งหมดที่ใช้ใน Vim

ในขณะเดียวกัน|sub-replace-special|นำคุณไปยังส่วนย่อยของ "4.2 ทดแทน" ซึ่งมีรูปแบบสำหรับการทดแทนในหมู่ซึ่ง\rสำหรับการแบ่งบรรทัด / แยก

(ทางลัดไปยังส่วนของคู่มือนี้คือ:h :s%)

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