Вызов функций поиска и замены для vim из скрипта bash - PullRequest
1 голос
/ 04 августа 2011

У меня есть ряд (> 100) файлов, которые я хочу обработать с помощью vim.Текст образца файла содержит следующее (только образец):

xyz.csv        /home/user/mydocs/abc.txt

/home/user/waves/wav.wav , user_wav.wav  

Я хочу заменить это на:

xyz.csv      /var/lib/mydir/abc.txt
/var/sounds/wav.wav , wav.wav  

В каждом из файлов изменения Iнужно сделать так же.Мой вопрос:

  1. Могу ли я использовать функцию поиска и замены в vim, вызывая ее из скрипта bash?

  2. Если так, как я могу это сделать?

PS: я искал в SO некоторые ответы и нашел некоторые ответы, такие как ex сценарии и т. Д. Я хочу знать, как можно вызвать сценарий ex из bash скрипт.

Ответы [ 5 ]

5 голосов
/ 04 августа 2011

Несмотря на то, что vim довольно мощный, я бы не использовал vim для этого.Вместо этого это можно сделать с помощью комбинации общих утилит командной строки.

Я предположил, что пустая строка в приведенном выше примере на самом деле пустая и не содержит пробелов или других пробельных символов.Вы можете использовать следующее, чтобы делать то, что вы хотите.

sed  -e "s,/home/user/mydocs,/var/lib/mydir," -e "s,/home/user/waves,/var/sounds," -e "/^$/d" file1

Вы можете использовать эту команду вместе с find и циклом for, чтобы сделать это для группы файлов:

for file in `find . -maxdepth 1 -type f`
do
    sed  -e "s,/home/user/mydocs,/var/lib/mydir," -e "s,/home/user/waves,/var/sounds," -e "/^$/d" $file
done

В цикле for указанная выше команда find ограничивает вывод всеми файлами в текущем каталоге (включая точечные файлы), присваивая каждую строку из вывода find переменной file, а затем запускает команду sedранее преобразовать файл так, как вы хотите, чтобы он был преобразован.

2 голосов
/ 04 августа 2011

Так вы бы вызвали скрипт ed из bash:

ed filename <<END
/^$/d
%s|/home/user/mydocs|/var/lib/mydir|
%s|/home/user/waves|/var/sounds|
%s|, user_|, |
w
q
END
1 голос
/ 05 августа 2011

Если все редактирование состоит из серии подстановок, наиболее идиоматичным способом выполнения этого с помощью Vim будет следующий:

  1. Откройте все целевые файлы одновременно.

    vim *.txt
    
  2. Запустить команды замещения для загруженных файлов.

    :argdo %s#/home/user/mydocs#/var/lib/mydir#
    :argdo %s#/home/user/waves#/var/sounds#
    :argdo %s/, \zsuser_//
    :" etc
    

    Или в одной команде:

    :argdo %s#/home/user/mydocs#/var/lib/mydir# | %s#/home/user/waves#/var/sounds# | %s/, \zsuser_//
    
  3. Если изменения сделаны правильно, сохраните их.

    :wall
    

Если редактирование, которое нужно автоматизировать, не может быть выражено только в подстановках, запишите макрос и выполните то же самое, как указано выше:

:argdo norm!@z

(здесь z - это имя макроса).

Наконец, если редактирование следует выполнять время от времени и его необходимо сохранить в виде скрипта, попробуйтеиспользуя подход, описанный в ответ на аналогичный вопрос .

1 голос
/ 04 августа 2011

Чтобы ответить с vim, вы можете сделать

vim -e 'bufdo!%s:\(xyz.csv        \)/home/user/mydocs/\(abc.txt\n\)\n.*:\1/var/lib/mydir/\2/var/sounds/wav.wav , wav.wav:' -e 'xa' FILES 

Примечание , я предположил, что вторая строка заменена статически, как это выглядело в вопросе.

Если вам не нравится писать длинные строки в вашем скрипте, вы можете создать файл наподобие:

s/FOO/BAR/
" several replacement and other commands
w " write the file
bd " if you want to

Затем выполните:

vim -e "buffdo!source /your_scriptfile" -e "x" FILES

НТН

0 голосов
/ 02 июня 2016

Ответ

Хотя большинство пользователей vim знают о команде% motion для выполнения инклюзивных команд для всего документа в текущем буфере. Большинство современных версий vim (т.е. 6.x +) поддерживают действия при поиске регулярных выражений для исключительных действий, например:

:/regex/substitute/match/replace/ # as vim command line
+"/reges/s/match/replace"         # as bash cli parameter

Это разбивается на vim, делая следующее,

  1. поиск по регулярному выражению и установка курсора в начало найденной точки
  2. вызов внутренней функции замены (см .: help s или: help substitute) [могут быть другие команды]
  3. совпадение строки с регулярным выражением для подстановки
  4. заменить новым строковым значением

По сути, он работает так же, как команда: global.

Примечания

Командой после поиска по регулярному выражению может быть любая команда, в том числе команды фильтра! Команды оболочки.

Справочная справка

  • : глобальная помощь
  • : помочь заменить
  • : справочный фильтр
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...