Vim içindeki normal ifadeyi, konsol komutu tarafından üretilen ifadesiyle argüman olarak üretilen bir çıktıyla değiştirme


7

Diyelim ki aşağıdaki içeriğe sahip bir dosyam var:

Bu bir _file_, bazı _special_ anahtar kelimelere sahip, onun yerine _like_ istediğim bir şey.

"% S / _ * _ / something" ile anahtar kelimelerdeki anahtar kelimeleri arayabilir ve değiştirebilirim, ancak "bir şeyin" harici bir komutun çıktısı olmasını istiyorum. Bu vim içinde mümkün mü, yoksa onu uyandırmalı mıyım?

Yanıtlar:


10

Evet yapabilirsin. Bakınız :help sub-replace-special; Bu \=, bir Vim ifadesi ile değiştirmenize olanak sağlar. Ve system()harici bir komutu çalıştırabilir ve çıktısını geri getirebilir. İle benim önemsiz örneği görün hostname. substitute()Çıktıdaki sondaki yeni satır karakterlerinden kurtulmak için kullanmak zorunda kaldığımı unutmayın .

:%s/_[^_]*_/\=substitute(system('hostname'),'\n','','g')/g

Not: Ayrıca regexp şablonunuzu da örneğinize uygun şekilde düzelttim.


5

Bana çok yardımcı olan Ingos cevabında, eşleşmenin bir alt yoluna nasıl atıfta bulunacağımı ve kabuk komutuna argüman olarak kullanacağımı ("ifadesiyle birlikte bir konsol komutu tarafından üretilen") göremiyorum.

: Benim durumumda ben aşağıdaki biçimde günlük hatları vardı [<unix timestamp>] <message>, yani [1406844000] foobar. Onları zamanla okunabilir bir formda hazırlamak istedim.

Aşağıdaki vim komutu, zaman damgası (altköşe 1) ve mesajla (geri kalan, altkötü 2) eşleşir ve tarih komutundan saat dizesini hazırlar:

:% s/^\[\(\d\+\)\] \(.*\)$/\=substitute(system('date -d @'.submatch(1)),'\n', '', 'g').': ['.submatch(1).'] '.submatch(2)/

[1406844000] foobaralır Fr 1. Aug 00:00:00 CEST 2014: [1406844000] foobar.

HTH


1

Bir ldiff dosyasındaki base64 değişimi için:

:%s/:: \(.*\)$/\=substitute(': ' . system('echo '.submatch(1).'|base64 -d'),'\n','','g')/
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.