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,

Другие вопросы по тегам