จะแทนที่เนื้อหาระหว่างสองรูปแบบจากไฟล์ได้อย่างไร


9

ฉันเป็นรูปแบบของไฟล์ต่อไปนี้:

<common>
fitnes=0
genetic=1
method=0
</common>
<inputs>
foo=bar
bar=foo
</inputs>
<limits>
balance=200.00
</limits>

และฉันต้องการที่จะลบทุกสิ่งที่อยู่ระหว่าง<inputs>และ</inputs>(ยกเว้นรูปแบบด้วยตนเอง) และแทนที่ด้วยเนื้อหาจากไฟล์อื่น (เช่นfoo.txt) กล่าวอีกนัยหนึ่งด้วยfoo=barและbar=fooจะถูกแทนที่ด้วยเนื้อหาอื่น

อาจเป็นไปได้ว่าคล้ายกับวิธีที่คุณลบการแข่งขันหลายบรรทัดเช่น:

:g/<inputs/,/inputs>/d

แต่ฉันไม่แน่ใจในสิ่งที่ฉันควรแทนที่dเพื่อแทรกเนื้อหาของไฟล์อื่น แต่ฉันต้องการเก็บรูปแบบการจับคู่ไว้

วิธีที่คล้ายกันคือการลบเนื้อหาภายในของแท็ก htmlเช่น

:/<inputs>/norm vitd

แต่ฉันไม่รู้ว่าคุณจะเพิ่มเนื้อหาลงในไฟล์ได้อย่างไร

เป็นการดีที่ฉันพยายามที่จะหาหนึ่งซับเพราะมันจะเป็นส่วนหนึ่งของสคริปต์อื่น

ฉันจะบรรลุสิ่งนั้นได้อย่างไร

คำตอบ:


10

การทดแทนสามารถใช้แทนรูปแบบด้วยผลลัพธ์ของนิพจน์เช่นนี้:

:keeppatterns %s;<inputs>\zs\_.\{-}\ze</inputs>;\=insert(readfile('test.txt'), '')

ดู :help sub-replace-expression

โปรดทราบว่าkeeppatternsป้องกันไม่ให้substituteคำสั่งจากการเพิ่มอะไรที่จะประวัติการค้นหาและรักษา "ค้นหาที่ผ่านมารูปแบบการลงทะเบียน" - :help "/ดู มันเป็นวิธีที่ดีเพื่อป้องกันไม่ให้สคริปต์จากการปรับเปลี่ยนโดยไม่จำเป็นรัฐทั่วโลกที่เป็นกลุ่มที่มีการปรับเปลี่ยนคำสั่งkeepalt, keepjumps, lockmarks, และkeepmarkskeeppatterns


5

ทางเลือกอื่นในการทำสิ่งนี้จาก Gary คือ:

:g/^<inputs>/+,/^<\/inputs>/-d|-r dummy

ซึ่งจะลบทุกอย่างในรูปแบบที่กำหนดไว้ก่อนใช้กว่า:rคำสั่งเพื่ออ่านข้อมูลจากไฟล์จำลอง ตอนนี้ถ้าคุณต้องการแยกชื่อไฟล์จากเส้นแบ่งระหว่าง<input>/</input>รูปแบบมันจะซับซ้อนขึ้นเล็กน้อย


4

ดูเหมือนว่าจะทำงานได้อย่างน้อยในระบบ Unix:

:/<inputs>/+1,/<\/inputs>/-1!cat foo.txt

โดยจะใช้{range}!{filter}คำสั่งในการกรองเส้นจากที่หนึ่งหลังจาก<inputs>การอย่างใดอย่างหนึ่งก่อนที่จะผ่านโปรแกรมภายนอก</inputs> cat foo.txtในกรณีนี้จะไม่สนใจเข้ามาตรฐานของตนเพื่อให้สายเดิมจะถูกลบออกไปและแทนที่ด้วยเนื้อหาของแฟ้มcatfoo.txt

ดู:

:help :range!
:help cmdline-ranges

2

ฉันรู้สึกว่าแมโครจะเป็นวิธีที่ง่ายกว่า โดยเฉพาะถ้าคุณมีสถานที่ต่าง ๆ ให้ทำเช่นเดียวกัน

  1. เปิดเฉพาะ 2 ไฟล์เหล่านั้น
  2. ตอนนี้ในไฟล์แรกเริ่มบันทึกโดยqa,( aเป็นชื่อบันทึก)
  3. ค้นหารูปแบบเริ่มต้นที่กดลงแล้วกดCtrl- vค้นหารูปแบบการสิ้นสุดกดขึ้น ตอนนี้เลือกส่วนที่คุณต้องการลบแล้ว ลบมัน.
  4. ทำเครื่องหมายตำแหน่งโดยใช้ma( aเป็นชื่อเครื่องหมาย) และบันทึกไฟล์
  5. ไปที่ไฟล์ที่ 2 โดย:b2คำสั่งและเลือกส่วนตามเกณฑ์เริ่มต้น / สิ้นสุดในทำนองเดียวกัน
  6. กลับมาที่ไฟล์นี้กดaเพื่อไปยังจุดนั้น pวางโดยมี
  7. ค้นหาเกณฑ์สิ้นสุดอีกครั้งและข้ามส่วนเพื่อไม่ตีอีกครั้ง
  8. ออกจาก recoding qโดยการกด
  9. 40@aทำซ้ำหลายครั้งโดย

1
ขอบคุณสำหรับคำแนะนำมันใช้ได้ แต่มันจะไม่ช่วยในกรณีพิเศษนี้เนื่องจากฉันกำลังมองหาโซลูชันที่ไม่โต้ตอบเป็นส่วนหนึ่งของexสคริปต์ที่ฉันสามารถระบุไฟล์ที่จะแทรกขึ้นอยู่กับอาร์กิวเมนต์การป้อนข้อมูลของผู้ใช้
kenorb

1

หากนี่เป็นอีกความพยายามในการแยกวิเคราะห์ XML ด้วยเครื่องมือที่ไม่ใช่ XML

การแก้ปัญหาที่นี่ถูกต้อง แต่ความตั้งใจอาจจะไม่ หาก XML ไม่ได้มาจากแหล่งที่เชื่องดีคุณอาจได้รับ Escape, CDATA หรือช่องว่างสีขาวในแท็ก!

ดังนั้น xsltproc จากคำสั่งใน vi สามารถจัดการได้


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