Открыть vim из bash оболочки script
Я хочу, чтобы оболочка bash выполняла следующие
- открыть файл с помощью vim
- записать что-то в файл
-
сохранить и выйти из файла
bashpromt# cat mybash.sh
echo "about to open a file"
vim file.txt #I need to use vim application to open a file
#now write something into file.txt
#close the that file.
echo "done."
Возможно ли это? Я нашел что-то вроде vim script, но не уверен, как его использовать.
Или что-то вроде "ЗДЕСЬ" может быть использовано для этого?
EDIT: Мне нужно проверить, что редактор vim отлично работает над нашей файловой системой. Поэтому мне нужно написать script, который вызывает vim и выполняет некоторую команду и закрывает ее. Мое требование не вписывается в такие вещи, как "echo" something " > file.txt". Мне нужно открыть файл с помощью vim.
Ответы
Ответ 1
У Vim есть несколько вариантов:
-
-c
= > передать команды ex. Пример: vim myfile.txt -c 'wq'
, чтобы последняя строка файла была завершена символом новой строки (если binary
каким-то образом не установлен script)
-
-s
= > воспроизвести сценарий, записанный с помощью -W
. Например, если ваш файл содержит ZZ
, то vim myfile.txt -s the_file_containing_ZZ
будет делать то же самое, что и раньше.
Также обратите внимание, что, вызывается как ex
, vim запускается в ex-режиме; вы можете попробовать ex my_file.txt <<< wq
Ответ 2
ex
- это версия командной строки для vi
и гораздо проще в использовании в скриптах.
ex $yourfile <<EOEX
:%s/$string_to_replace/$string_to_replace_it_with/g
:x
EOEX
Ответ 3
Вы спросили, как написать "что-то" в текстовый файл через vim, и ответ не обязательно должен был его охватить.
Вставить текст:
ex $yourfile <<EOEX
:i
my text to insert
.
:x
EOEX
:i
переходит в режим вставки. Все следующие строки вставляются в текст до тех пор, пока .
не появится сам по себе в своей строке.
Вот как искать и вставлять. Вы можете сделать что-то вроде:
ex $yourfile <<EOEX
:/my search query\zs
:a
my text to insert
.
:x
EOEX
Здесь будет найден первый выбор, который соответствует регулярному выражению, указанному :/
, поместите курсор в местоположение, указанное \zs
, и введите режим вставки после курсора.
Вы можете перемещать \zs
для достижения разных результатов. Например:
ex $yourfile <<EOEX
:/start of match \zs end of match
:a
my text to insert
.
:x
EOEX
Это изменит первое вхождение "начала совпадения конца матча" на "начало совпадения моего текста с вставкой конца матча".
Если вы хотите разрешить любое количество пробелов в поиске между ключевыми словами, используйте \_s*
. Например, поиск функции, которая возвращает 0: :/\_s*return\_s*0}
Ответ 4
Если вы хотите видеть, что работа выполняется внутри vim или gvim, вы можете использовать -remote-send
gvim --servername SHELL_DRIVER
bashpromt# cat mybash.sh
#!/bin/bash
echo "about to open $1"
gvim --servername SHELL_DRIVER $1 #I need to use vim application to open a file
#now write something into file.txt and close it
gvim --servername SHELL_DRIVER --remote-send '<ESC>i something to the file<ESC>:wq<CR>'
echo "done."
Это будет медленно, но сделает то, что вы хотите.
Сначала мы открываем gvim, в котором мы можем открыть все наши файлы (для эффективности)
С первой линией gvim мы открываем файл в ранее открытом gvim.
На второй строке gvim мы отправляем команду на ранее открытый экземпляр gvim (с желаемым файлом, который все еще открыт).
Команда выглядит следующим образом:
<ESC>
- выйти из любого режима, который мог быть gvim в
i something to the file
- перейдите в режим вставки и введите "что-то в файл"
<ESC>
- режим ввода вставки
:wq
- напишите файл и закройте vim
Ответ 5
Недавно у меня ответил аналогичный вопрос, "автоматическое редактирование нескольких
файлы. Возможно, решение, которое я опишу, будет удовлетворять вашим потребностям.