автоматическое редактирование нескольких файлов - PullRequest
6 голосов
/ 09 мая 2011

У меня много файлов, и я хочу удалить строки с 1 по 55, затем добавить комментарий (например: //) для строки с 25 по 35, а затем сохранить в новый файл.

Как мне сделать это автоматически с помощью vim on bash shell?

Ответы [ 2 ]

15 голосов
/ 09 мая 2011

Несмотря на то, что использование ed или sed является обычной практикой 1 , иногда использование Vim намного удобнее. 2 Действительно, в этом случае вместонаписав ed -подобный скрипт «вслепую», проще выполнить желаемое редактирование одного из файлов в интерактивном режиме с помощью

vim -w log.vim file1.txt

, а затем повторить его для остальных файлов.

for f in file*.txt; do vim -s log.vim "$f"; done

В вашем случае log.vim файл, скорее всего, будет иметь содержимое, похожее на это:

gg55dd:25,35s/^/\/\/ /
:w %_new
:q!

Обратите внимание, что для сохранения файла с новым именем вы не должны набирать его напрямую, а использовать % замена.Другим способом может быть предварительное дублирование файлов, а затем их редактирование на месте (сохранение каждого из них :w).

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


1 И, конечно, вы можете сделать то же самое в стиле ed.

for f in file*.txt; do vim -c '1,55d|25,35s/^/\/\/ /|w! '"${f}_new"'|q!' $f

2 Не говоря уже о том, что в вопросе четко указано, что решение Vim является предпочтительным.

3 голосов
/ 09 мая 2011

Вы можете сделать это элегантно с ed , редактором строки Unix, предком vi.

fix_file () {
    ed $1 <<< EOF
    1,55d
    25,35s_.*_// &_
    wq   
    EOF
}

Теперь, для каждого файла F, который вам нужен, просто выполните fix_file F.

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