ฉันสามารถใช้
:5,12s/foo/bar/g
เพื่อค้นหาfoo
และแทนที่bar
ระหว่างบรรทัดที่ 5 และ 12 ฉันจะทำสิ่งนั้นเฉพาะในบรรทัดที่ 5 และ 12 ได้อย่างไร (และไม่อยู่ในระหว่างบรรทัด)
ฉันสามารถใช้
:5,12s/foo/bar/g
เพื่อค้นหาfoo
และแทนที่bar
ระหว่างบรรทัดที่ 5 และ 12 ฉันจะทำสิ่งนั้นเฉพาะในบรรทัดที่ 5 และ 12 ได้อย่างไร (และไม่อยู่ในระหว่างบรรทัด)
คำตอบ:
Vim มีอะตอมของนิพจน์ทั่วไปพิเศษที่ตรงกับบรรทัดคอลัมน์ ฯลฯ คุณสามารถใช้ (อาจนอกเหนือจากช่วง) เพื่อ จำกัด การแข่งขัน:
:5,12s/\(\%5l\|\%12l\)foo/bar/g
ดู :help /\%l
คุณสามารถทำการเปลี่ยนตัวในบรรทัดที่ 5 และทำซ้ำโดยใช้ความพยายามเพียงเล็กน้อยในบรรทัดที่ 12:
:5s/foo/bar
:12&
ตามที่ Ingo ชี้ไว้ให้:&
ลืมธงของคุณ เนื่องจากคุณใช้/g
คำสั่งที่ถูกต้องจะเป็น:&&
:
:5s/foo/bar/g
:12&&
ดู:help :&
และเพื่อน.
:&
เพื่อใช้งาน หากมีแฟล็ก ( s/../../g
) ต้องใช้:&&
แม้ว่า ...
\(\%5l\|\%12l\)
คลุมเครือมากกว่า:&
คุณสามารถเพิ่ม a c
ต่อท้ายได้เสมอ สิ่งนี้จะขอการยืนยันสำหรับการแข่งขันแต่ละครั้ง
:5,12s/foo/bar/gc
g
ธงอยู่ในการเล่น)
n
5 หรือ 6 ครั้งเป็นเรื่องยุ่งยากมากกว่าการเพิ่ม\(\%5l\|\%12l\)
คำสั่งแทน
คำถามที่น่าสนใจ ดูเหมือนว่าจะมีเฉพาะการเลือกช่วงและไม่มีการเลือกหลายบรรทัด:
http://vim.wikia.com/wiki/Ranges
อย่างไรก็ตามหากคุณมีสิ่งพิเศษในบรรทัดที่ 5 และ 12 คุณสามารถใช้ตัว:g
ดำเนินการได้ หากไฟล์ของคุณมีลักษณะเช่นนี้ (ตัวเลขสำหรับอ้างอิงเท่านั้น):
1 line one
2 line one
3 line one
4 line one
5 enil one
6 line one
7 line one
8 line one
9 line one
10 line one
11 line one
12 enil one
และคุณต้องการแทนที่one
ด้วยeno
บนเส้นที่มีenil
แทนline
:
:g/enil/s/one/eno/
คุณสามารถใช้ed
- โปรแกรมแก้ไขข้อความเชิงบรรทัดที่มีคำสั่งคล้ายกับ vi และ vim มันอาจเกิดขึ้นก่อน VI และ Vim
ในสคริปต์ (โดยใช้เอกสารที่นี่ซึ่งประมวลผลอินพุตจนถึงเครื่องหมาย EndCommand) จะมีลักษณะดังนี้:
ed file <<EndCommands
5
s/foo/bar/g
7
s/foo/bar/g
wq
EndCommands
เห็นได้ชัดว่าคำสั่ง ed สามารถใช้กับบรรทัดคำสั่งได้เช่นกัน
vim
ทางเลือกอื่น
:s
แต่ยังคงมีการทำซ้ำของ:s
คำสั่ง (ซึ่งโซลูชันของ romainl หลีกเลี่ยง)
sed
คือ ...