2015-06-24 2 views
-4

Я работаю с оболочкой Korn. Существует файл журнала, который постоянно обновляется. Мне нужно обновить этот файл и вставить в него один символ. Я пишу для нее сценарий оболочки. Может ли кто-нибудь предложить мне, как я могу это сделать через скрипт? Мне нужно открыть и закрыть этот файл, используя редактор vi через скрипт. Пожалуйста, предложите способ для этого.Работа с редактором vi через скрипт

Вот команды, которые я использую, когда я редактировать этот файл: VI my_file Нажмите «E/е» (для начала редактирования) Нажмите «я» (вставить) Нажмите «F» (для вставки отсутствует F) Нажмите: Esc ->: -> wq! -> [Enter] -> y -> [Enter] *

Мне нужно вставить один F в начале первой строчки в этом файле. Может кто-нибудь подскажет мне, как я могу это сделать через редактор vi ?. Я не могу использовать любой другой редактор, такой как sed, потому что этот файл постоянно обновляется.

+3

Вместо того, чтобы предполагать, что 'vi' является правильным инструментом для задания, почему бы не описать задачу достаточно подробно, чтобы люди могли предложить что-то, что * является * соответствующим инструментом? –

+1

"этот файл постоянно обновляется"?'vi' не более атомный, чем' sed' (хотя у 'sed -i'_does_ есть свои собственные ошибки), поэтому я не знаю, какую проблему вы, по-вашему, решаете. –

+0

... если у вас есть файл, который изменяется другими процессами, и вы хотите быть уверенным, что ваши изменения не топают на изменения, которые другой процесс хочет сделать, тогда вам нужно взглянуть на консультативную блокировку - и изменить другой процесс сделать то же самое. –

ответ

0

vi является «визуальным» редактором. Он предназначен для интерактивного использования человеком, который смотрит на терминал и вводит команды; это то, что означает «визуальный».


Сценарий приводом эквивалентно vi является ex. (Часто ex фактически предоставляется вашим пакетом vi или даже тем же исполняемым файлом).

Если вы можете написать что-то в командном режиме vi, который будет делать то, что вы хотите, вы можете подать это как скрипт на ex.


Пример, испытанные против BSD от Apple ex:

ex -c ':open filename-to-edit' -c '1s/^/F/' -c ':wq' 

Пример испытания против ex поставляется с vim:

ex -s filename-to-edit <<'EOF' 
1s/^/F/ 
:wq 
EOF 

С другой стороны, без использования vi или ex вообще:

tempfile=$(mktemp) 
{ printf %s 'F'; cat filename-to-edit; } >"$tempfile" 
mv "$tempfile" filename-to-edit || rm -f "$tempfile" 
+0

Можете ли вы предложить мне код, как я могу использовать «ex»? С блоком кода. – user286009

+0

@ user286009, я привел пример, такой как он есть. Поскольку вы хотите использовать 'vi', я предполагаю, что вы уже знаете режим командной строки' vi' достаточно хорошо, чтобы написать команду для фактической операции, которую вы хотите выполнить, и, таким образом, единственный вопрос об использовании командной строки 'ex' , –

+0

Теперь я обновил свой вопрос. Пожалуйста, смотрите и предлагайте. – user286009

0

Я думаю, что вы хотите получить ответ, как

vi my_file <@ >/dev/null 2>&1 
iF<ESC> 
:wq 
@ 

с последовательностью убегания ESC, что вы можете войти, набрав CTRL-V ESC
Символ новой строки перед: WQ не требуется, но делает это мусор немного легче читать.

Я боюсь, что это решение будет работать большую часть времени, пока некоторые протоколы не исчезнут. vi создает рабочую копию файла, редактирует рабочую копию и записывает эту копию. Изменения во время редактирования не будут видны. Вы можете проверить это, открыв тот же файл с vi в двух окнах. Или даже в одном окне:

vi testfile <@ >/dev/null 2>&1 
iFirstline 
Second Line<ESC> 
:r !date 
:w 
:! echo This line will be gone >> testfile 
:wq 
@ 

Теперь проверьте тестовый файл.

Смежные вопросы