vim, ed или sed многократный поиск и замена в заданном файле
Я хочу сделать серию "поиск и замена" в данном файле, скажем file.txt. Например,
s/foo/bar/g
s/abc/xyz/g
s/pqr/lmn/
g/string-delete/d
и так далее.
Как мне записать все эти действия в файл сценария, а затем запустить их за один раз в целевом файле file.txt, чтобы сохранить его в newfile.txt?
Я видел этот пост Поиск и замена переменных в файле, используя bash/sed, но почему-то не смог заставить его работать на меня.
Изменить: я бы предпочел решение на основе VIM / ED Thanx Tempora
4 ответа
Вы можете просто написать функцию, обернуть эти команды и вызвать функцию.
Примечание!!
функция ниже является примером, я добавил %
перед вашим s
CMD. потому что я предполагаю, что вы хотите произвести замену всего буфера, а не текущей строки. Но вы должны быть осторожны, таким образом, предыдущий замененный результат может быть снова заменен последней командой, если последний шаблон соответствует. просто настройте его в соответствии со своими потребностями.
например, подумайте о:
текст: fooc
у тебя есть %s/foo/ab/g
а также %s/abc/def/g
fun! ExecThem()
%s/foo/bar/g
%s/abc/xyz/g
%s/pqr/lmn/g
g/string-delete/d
endf
источник функции, затем
:call ExecThem()
сделаю работу.
Конечно, вы можете создать команду для этого:
command Mybatch call ExecThem()
Использование :source {file}
запустить скрипт vim.
Сохраните ваши команды в файл, например commands.vim
, Затем откройте буфер, к которому вы хотите применить команды, и установите источник commands.vim
файл вроде так:
:so commands.vim
Замечания: :so
коротка для :source
Для получения дополнительной помощи см.:
:h :so
Вы можете поместить команды в файл и передать его sed -f
:
$ cat commands.sed↵
s/foo/bar/g
s/abc/xyz/g
s/pqr/lmn/
/string-delete/d
$ sed -f commands.sed my_input.txt > my_output.txt↵
или даже сделать это shell-скриптом
$ cat munge.sed↵
#!/bin/sed -f
s/foo/bar/g
s/abc/xyz/g
s/pqr/lmn/
/string-delete/d
$ chmod a+x commands.sed↵
$ ./munge.sed my_input.txt > my_output.txt↵
Наконец, вы можете передать команды непосредственно sed(1)
как однострочник:
$ sed -e "s/foo/bar/g" -e "s/abc/xyz/g" -e "s/pqr/lmn/" -e "/string-delete/d" my_input.txt > my_output.txt↵
Простой и быстрый способ - скопировать команды в регистр с "ay
а затем запустить регистр как макрос с @a
,