คำถามติดแท็ก substitute

การดำเนินการใด ๆ ที่เกี่ยวข้องกับการแทนที่ข้อความตามนิพจน์ทั่วไปเช่นคำสั่ง ex-mode ": s` อย่าสับสนกับแท็ก [แทนที่]

11
วิธีค้นหาและแทนที่ Vim โดยไม่ต้องพิมพ์คำต้นฉบับ?
ฉันต้องการเพิ่มประสิทธิภาพเวิร์กโฟลว์ "ค้นหาและแทนที่" ใน Vim มันเป็นสิ่งที่ฉันทำบ่อยๆเพราะฉันมั่นใจว่าพวกคุณส่วนใหญ่ก็เช่นกัน โดยปกติบางสิ่งบางอย่างตามแนว - คัดลอกบล็อกและเปลี่ยนชื่อของตัวแปรในไม่กี่แห่ง ฉันรู้ว่าฉันรู้ว่าอาจเป็นสาเหตุของการสะท้อน "ทำไมคุณคัดลอกและวางรหัส" แต่อย่าไปลงที่ถนนนั้น ... มีกรณีการใช้งานที่ถูกต้องมากมาย :) ฉันตระหนักดีถึงการค้นหาและแทนที่คำสั่ง: :sหรือ:%sแต่ฉันไม่ชอบพวกเขา มันบังคับให้ฉันพิมพ์ทั้งชื่อตัวแปรแบบเต็มที่ฉันค้นหาและสิ่งที่ฉันเปลี่ยนไป อาจจะมีวิธีที่ดีกว่าในการแก้ไขปริมาณการพิมพ์ด้วย:%s? ฉันมักจะใช้ชื่อตัวแปรอธิบายยาว ๆ เพื่อที่จะเป็นตัวแบ่งข้อตกลงสำหรับฉัน ฉันไม่ชอบว่าการพิมพ์ชื่อตัวแปรตั้งแต่ต้นนั้นเป็นเรื่องที่พิมพ์ได้ง่ายและสามารถใช้เวลาและสมองกำลังตามล่าตัวพิมพ์ผิด ฉันชอบพิมพ์ครั้งเดียวแล้วคัดลอกและวางเพื่อหลีกเลี่ยงปัญหานี้โดยสิ้นเชิงถ้าเป็นไปได้ เวิร์กโฟลว์ปัจจุบันของฉันใช้การเคลื่อนไหว / ดึง / เลือก / ค้นหา / วางเพื่อย้ายไปรอบ ๆ ไฟล์และแทนที่ทีละไฟล์ มันไม่ดี แต่มีประโยชน์ในการหลีกเลี่ยงการพิมพ์ชื่อตัวแปรแบบเต็ม ฉันอาจต้องพิมพ์ตัวอักษรสองสามตัวแรกด้วย/หรือใช้คำสั่งการเคลื่อนไหวอื่น (เช่นfx) ขึ้นอยู่กับสิ่งที่อยู่รอบ ๆ แล้วกดveเพื่อเลือกคำทั้งหมด ฉันไม่สนใจว่าฉันต้องทำซ้ำทุกครั้ง ฉันไม่เคยทำการค้นหาแบบเต็มโดยไม่ยืนยันการเปลี่ยนแปลงแต่ละครั้ง แต่มันจะดีกว่าถ้าฉันสามารถทำซ้ำการดำเนินการแทนด้วยการกดแป้นเดียว (ซึ่งฉันไม่สามารถทำได้ด้วยวิธีนี้) แต่ละทดแทนมักจะเป็นสิ่งที่ต้องการnจากนั้นveแล้วp(หรือแย่"0p) มีวิธีที่เร็วกว่านี้ไหม

3
จะเปลี่ยนเฉพาะภายในการเลือกภาพได้อย่างไร
หนึ่งจะได้รับเป็นกลุ่มเพื่อแทนที่ตัวละครในการเลือกภาพเท่านั้นและไม่ได้ที่อื่นในบรรทัด? ตัวอย่าง: เส้น: int arr[] = { 00 01 02 03 04 05 05 /* ... lots more like this*/}; การเลือกภาพ: { 00 01 02 03 04 05 05 /*... lots more like this*/} คำสั่ง: :'<,'>s/\ /\,0x/g ที่คาดว่าจะ int arr[] = {0x00,0x01,0x02,0x03 /* and so on*/}; อย่างไรก็ตามหลังจากดำเนินการเหล่านี้แล้วผลลัพธ์ที่แท้จริงคือ: int,0xarr[],0x=,0x{0x00,0x01,0x02,0x03 /* and …

3
ค้นหาและแทนที่ด้วยนิพจน์ทั่วไป
ฉันมีไฟล์ที่มีค่าเริ่มต้นของผู้ใช้เป็นจำนวนมากฉันต้องการเปลี่ยนข้อความบางส่วน แต่ฉันกำลังต่อสู้กับผู้จับคู่และผู้แทนที่ ใช้ตัวอย่างต่อไปนี้: ############################################################################### # Trackpad, mouse, keyboard, Bluetooth accessories, and input # ############################################################################### # Trackpad: enable tap to click for this user and for the login screen defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true ฉันต้องการแทนที่# Trackpad: ...ด้วยrunning "Trackpad: ..." เมื่อหมดปัญหาฉันก็พบกับบางสิ่งที่ใช้เครื่องมือทดสอบ regex: /\n\n#\s(.*)/g ถ้าฉันลองและใช้สิ่งนี้เป็นกลุ่มมันไม่ได้ผลสำหรับฉัน: :/\n\n#\s(.*)/running "\1"/g ฉันเดาว่าปัญหาของฉันเดือดร้อนเหลือคำถามสองข้อ: ฉันจะหลีกเลี่ยงการค้นหา\nตัวอักษรและให้แน่ใจว่า#จะไม่ปรากฏในตอนท้ายของกลุ่มการค้นหา? ฉันจะใช้กลุ่มการดักจับได้อย่างมีประสิทธิภาพได้อย่างไร มีคำตอบที่ดีบางข้อด้านล่าง ยากที่จะเลือกระหว่างทั้งสาม …

1
วิธีแก้ไขไฟล์แบบไม่โต้ตอบ (เช่นในไพพ์ไลน์)?
ฉันต้องการแก้ไขไฟล์ที่ส่งผ่านไปป์ไลน์โดยใช้ vim แบบไม่โต้ตอบหรือแก้ไขไฟล์ในตำแหน่ง (คล้ายกับsed) ตัวอย่างการใช้sed: $ sed -i'.bak' s/foo/test/g file # Edit file in-place. $ cat file | sed s/foo/test/g # Parse file in pipeline. อย่างไรก็ตามฉันสามารถอ่านที่นี่ว่า: sedเป็นS tream ED itor ไม่ใช่ตัวแก้ไขไฟล์ อย่างไรก็ตามผู้คนทุกที่มีแนวโน้มที่จะละเมิดมันสำหรับพยายามแก้ไขไฟล์ มันไม่ได้แก้ไขไฟล์ ประการที่สองตัวเลือกบางอย่างเช่นการแก้ไขในสถานที่ ( -i) เป็นแบบพกพา วิธีการทำงานเหมือนกันสามารถทำได้ในกลุ่ม?

1
อย่างไร: g /^$/,/./- j (ลดบรรทัดว่างหลาย ๆ บรรทัดเป็นหนึ่งช่องว่าง) ทำงานเป็นกลุ่ม?
ในบทความVim Regular Expressions , Oleg Raisky ให้คำสั่งต่อไปนี้เพื่อลดบรรทัดว่างหลายบรรทัดให้เป็นหนึ่งช่องว่าง: :g/^$/,/./-j มีคนช่วยอธิบายวิธีการทำงานนี้ได้ไหม ฉันรู้ว่า:gคำสั่งและการแสดงออกปกติ แต่ฉันไม่เข้าใจว่าส่วน/,/./-jนั้นทำอะไร

2
แทนที่สตริงโดยไม่ต้องเปลี่ยนเคส?
เนื่องจากการเล่นโวหารในภาษาเฉพาะโดเมนที่ฉันทำงานด้วยฉันมักเผชิญกับงานของ (เลือกไม่ได้ทั่วโลก) แทนที่termหรือTERMด้วยwordหรือWORDตามลำดับ วิธีนี้ผมค้นหากรณี insensitively สำหรับterm, และต้องการที่จะแทนที่ด้วยword ขณะที่การรักษาตัวพิมพ์ใหญ่ / ตัวพิมพ์เล็กของเดิมtermเหมือนเดิม ตั้งแต่การตรวจสอบทั้งtermสำหรับสอดคล้อง / พิมพ์เล็กพิมพ์ใหญ่จะเป็นเรื่องยากและไม่จำเป็นจริงๆผมจะชำระสำหรับพิมพ์ใหญ่ / ตัวพิมพ์เล็กword/ ถูกตัดสินใจเกี่ยวกับอักษรตัวแรกของWORDterm ฉันจะบรรลุสิ่งนี้ได้อย่างไร
18 substitute 

5
ฉันสามารถทำสิ่งที่มีการโต้ตอบ: การแทนที่ (การค้นหาและแทนที่) ได้หรือไม่?
บางครั้งฉันใช้:sกับ regexp ที่ซับซ้อนซึ่งอาจหรืออาจไม่ถูกต้องหรือไม่แน่ใจว่าฉันต้องการแทนที่การแข่งขันทั้งหมดหรือไม่ มีวิธีใดบ้างที่ฉันสามารถบอกให้ Vim ยืนยันการแข่งขันทุกครั้งที่พบก่อนที่จะแทนที่ข้อความจริงหรือไม่
17 substitute 

5
แทนที่ชุดสัญลักษณ์แสดงหัวข้อย่อยของเครื่องหมายดอกจันด้วยรายการหมายเลข
ลองนึกภาพฉันมีข้อความต่อไปนี้: some random stuff * asdf * foo * bar some other random stuff ฉันต้องการแทนที่สัญลักษณ์ดอกจันด้วยตัวเลขเช่น: some random stuff 1. asdf 2. foo 3. bar some other random stuff สิ่งนี้สามารถทำได้ในกลุ่ม?


2
ตัวเลือกทดแทนหลายรายการ?
โดยปกติcตัวเลือกทดแทนจะให้ฉันสองตัวเลือก: (y) es หรือ (n) o เป็นไปได้ไหมที่จะมีตัวเลือกใช่ที่มีให้เลือกหลายหมายเลข? ตัวอย่าง ไฟล์ person: Alice dog: Tobby person: Bob รูปแบบ 1 :%s/person:/woman:/c รูปแบบ 2 :%s/person:/man:/c รูปแบบที่ 1 และ 2 มีรูปแบบการค้นหาเดียวกัน แต่รูปแบบการแทนที่ที่แตกต่างกัน ฉันต้องการรวมไว้ในรูปแบบเดียวด้วยตัวเลือกในการกด (1) เพื่อทดแทน 1, (2) สำหรับการแทนที่ 2 หรือ (n) โดยไม่มีการแทนที่
15 substitute 

2
ฉันจะรันได้อย่างไร: แทนที่ส่วนใดส่วนหนึ่งของบรรทัดและไม่ได้ทั้งหมด
ฉันมีเส้นแบบนี้: function my_function(argument, another argument, but there are spaces) ฉันต้องการแทนที่อักขระช่องว่าง (ภายในชื่ออาร์กิวเมนต์) ด้วยเครื่องหมายขีดล่าง ฉันต้องการใช้: :s/\ /_/g แต่ฉันจะเลือกที่จะไม่ใช้กับทั้งบรรทัดได้อย่างไร แต่เริ่มจากพูดตำแหน่งเคอร์เซอร์ (หรือคำที่สาม)?

4
จะแทนที่แต่ละนัดด้วยตัวนับที่เพิ่มขึ้นได้อย่างไร
ฉันต้องการค้นหาและแทนที่แต่ละรูปแบบที่แน่นอนด้วยตัวเลขทศนิยมซึ่งเริ่มต้นที่1และเพิ่มขึ้นทีละหนึ่งสำหรับแต่ละการแข่งขัน ฉันสามารถค้นหาคำถามที่มีคำพูดในทำนองเดียวกันที่กลายเป็นว่าไม่เกี่ยวกับการเพิ่มจำนวนตัวนับ แต่แก้ไขการจับคู่แต่ละครั้งด้วยจำนวนเงินที่แน่นอน คำถามที่คล้ายกันอื่น ๆ เกี่ยวกับการแทรกหมายเลขบรรทัดมากกว่าตัวนับที่เพิ่มขึ้น ตัวอย่างก่อน: #1 #1.25 #1.5 #2 หลังจาก: #1 #2 #3 #4 ข้อมูลจริงของฉันมีข้อความมากขึ้นทุกสิ่งที่ฉันต้องการหมายเลขใหม่
14 substitute 

4
เหตุผลสำหรับ \ r และ \ n หมายถึงสิ่งต่าง ๆ ในคำสั่ง s?
เราทุกคนรู้ว่าเมื่อค้นหา\nคือขึ้นบรรทัดใหม่และ\rเป็น carriage return ( ^M) แต่เมื่อแทนที่\rเป็นขึ้นบรรทัดใหม่ในขณะที่\nเป็นโมฆะ null ( ^@) ต้นกำเนิดของความไม่สมดุลนี้คืออะไร? ระบุว่าพฤติกรรมนี้เป็น ... แปลกประหลาดที่จะพูดน้อย (และค่อนข้างต่อต้านเมื่อคุณได้รับมันผิดครั้งแรก) ฉันคาดว่าจะมีเหตุผลทางประวัติศาสตร์ที่แปลกประหลาด (บังเอิญมีวิธี "แก้ไข" พฤติกรรมนี้และทำให้บางสิ่งบางอย่างง่ายขึ้นหรือไม่)

6
ลบรายการที่ซ้ำกันทั้งหมด
ฉันมีไฟล์ที่มีลักษณะเช่นนี้ Move to 230.00 Hold Hold Hold Hold Hold Hold Move to 00.00 Hold Hold Hold Hold Hold FooBar Hold Spam Hold ฉันอยากให้มันเป็นแบบนี้: Move to 230.00 Hold Move to 00.00 Hold FooBar Hold Spam Hold ฉันแน่ใจว่าจะต้องมีวิธีที่เป็นกลุ่มได้อย่างรวดเร็วสามารถทำเช่นนี้ แต่ฉันไม่สามารถห่อหัวของฉันได้อย่างไร สิ่งนี้เกินความสามารถของมาโครและต้องการ vimscript ไหม? นอกจากนี้ยังตกลงถ้าฉันต้องใช้แมโครเดียวกันกับแต่ละบล็อกของ "การพัก" ไม่จำเป็นต้องเป็นแมโครเดียวที่ได้รับทั้งไฟล์แม้ว่ามันจะยอดเยี่ยม

1
การแทนที่เครื่องหมายทับ (/) ด้วยเครื่องหมายอัศเจรีย์ (!) ในคำสั่งทดแทนหมายถึงอะไร
ฉันเพิ่งเห็นคำสั่งทดแทนที่ผู้เขียนมีการ/แทนที่ด้วย!เช่นนี้::s!abc!ABC!g ฉันพยายามค้นหาเอกสารบางอย่างเกี่ยวกับการใช้งานนี้ แต่ฉันไม่พบสิ่งใดที่เกี่ยวข้อง ดังนั้นฉันจึงพยายามทดสอบด้วยตัวเองและอีกครั้งฉันไม่สามารถหาความแตกต่างที่แท้จริงระหว่างสองสัญญาณได้ นี่คือสิ่งที่ฉันพบ: มันเป็นไปไม่ได้ที่จะผสม!และ/ในคำสั่ง ตัวอย่างเช่น:s!abc/ABCล้มเหลว มันอาจมีประโยชน์ที่จะใช้!เพื่อหลีกเลี่ยงการหลบหนี/ในรูปแบบ ตัวอย่างเช่นถ้าผมต้องการที่จะเปลี่ยน</กับ%ฉันสามารถใช้แทน:%s!</!%!g:%s/<\//%/g ดูเหมือนว่าในบางกรณี regex บางอย่างจะไม่ทำงาน/และทำงานอย่างถูกต้องด้วย!แต่ฉันไม่ได้เป็นผู้เชี่ยวชาญ regex จริงๆฉันไม่แน่ใจ ดังนั้นคำถามของฉันเป็นเรื่องง่าย: ประโยชน์ของการใช้คืออะไร!ในคำสั่งแทนและเมื่อฉันควรจะตัดสินใจที่จะใช้มันแทน/?
13 substitute 

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