2015-10-24 3 views
0

Я в настоящее время застрял в vim, пытаясь найти поиск/замену oneliner, чтобы заменить число другим приращением для каждой новой итерации = когда найдет новое совпадение.Vim search replace regex + incremental function

Я работаю в xml svg-коде для пакетных файлов процессов Inkscape не может обрабатывать текст (простая текстовая ошибка svg).

<tspan 
     x="938.91315" 
     y="783.20563" 
     id="tspan13017" 
     style="font-weight:bold">Text1:</tspan><tspan 
     x="938.91315" 
     y="833.20563" 
     id="tspan13019">Text2</tspan><tspan 
     x="938.91315" 
     y="883.20563" 
     id="tspan13021">✗Text3</tspan> 

т.д.

Так что я хочу сделать, это изменить, что к такому результату:

<tspan 
     x="938.91315" 
     y="200" 
     id="tspan13017" 
     style="font-weight:bold">Text1:</tspan><tspan 
     x="938.91315" 
     y="240" 
     id="tspan13019">Text2</tspan><tspan 
     x="938.91315" 
     y="280" 
     id="tspan13021">✗Text3</tspan> 

т.д.

Так я duckducked и нашел лучший ВИМ советы ресурс от zzapper, но я не могу этого понять:

конвертировать yy в 10,11,12:

: пусть i = 10 | 'А' BG/Abc/s/уу/\ = я/| пусть я = я + 1

Затем я приспособил его к чему-то я могу понять и должен работать в своем родном Vim:

:let i=300 | 327,$ smagic ! y=\"[0-9]\+.[0-9]\+\" ! \=i ! g | let i=i+50 

Но почему-то это не петля, все это я получаю, что:

<tspan 
     x="938.91315" 
     300 
     id="tspan13017" 
     style="font-weight:bold">Text1:</tspan><tspan 
     x="938.91315" 
     300 
     id="tspan13019">Text2</tspan><tspan 
     x="938.91315" 
     300 
     id="tspan13021">✗Text3</tspan> 

Так вот я серьезно застрял. Я не могу понять, что не работает:

  • Моя адаптация оригинальной формулы?
  • Мое расположение данных?
  • My .vimrc?

Я попытаюсь найти другие ресурсы самостоятельно, но на такой трюк они довольно редко встречаются и, как и в советах zzapper, не всегда доставлены с помощью руководства.

ответ

1

Один из способов это исправить:

:let i = 300 | g/\m\<y=/ s/\my="\zs\d\+.\d\+\ze"/\=i/ | let i += 50 

Перевод:

  • let i = 300 - надеюсь, очевидно
  • g/\m\<y=/ ... - для всех строк, соответствующих \m\<y=, примените следующую команду; «следующая команда» - s/.../.../ | let ...; регулярное выражение:
    • \m - "магия" регулярное выражение
    • \< - совпадают только на границе слова
  • s/\my="\zs\d\+.\d\+\ze"/\=i/ - заменителя; регулярное выражение:
    • \m - "магия" регулярное выражение
    • \d\+ - один или несколько цифр
    • \zs...\ze - заменить только то, что согласуется между этими точками
    • \=i - заменить со значением выражения i
  • let i += 50 - надеюсь, снова очевидно.

Для получения дополнительной информации: :help :g, :help \zs, :help \ze, help s/\\=.

+0

Спасибо! Работает отлично! И ваши объяснения помогли мне расширить мою неуклюжую формулу, как только я понял, что это: команда g, которая позволяет поведение цикла. Тогда мое предложение: пусть i = 300 | 323, $ g/y = "/ smagic! [0-9] \ +. [0-9] \ +! \ = I! G | пусть i + = 50 Я скажу так же, как и ответ, для тех, меня, кто потерян, когда слишком много писем и обратного сбрасывания;) –

0

Просто, чтобы добавить мой прием в виде записки (написал это как ответ, так как EDIT не показалось правильным). Извините, это не лучший скрипт vim здесь, но он позволяет мне понять (я не специалист по vim).

:let i=300 | 323,$g/y="/smagic![0-9]\+.[0-9]\+!\=i!g | let i+=50 

Назначьте начальное значение I:

:let i=300 

Начало: глобальные: функции от линии 323 до конца файла (г):

323,$g 

шаблон для соответствия для выполнения команды (текстовый текст здесь)

y=" 

Замещение магии на (магическое значение специальных символов «включено»)

smagic 

шаблон, чтобы найти

[0-9]\+.[0-9]\+ 

(цифры от 0-9 один или несколько раз, в litteral точки, цифры еще раз)

Заменено

\=i 

\ = говорит Vim для оценки я не ВИР Т.е litterally

приращению я с 50 для следующей итерации

let i+=50 

Эта часть все еще находится в функции г.

Разделители жирным шрифтом: | являются разделителями между различными функциями / являются разделителями в функции: g ! являются разделителями в симаговой функции