2

我想对给定的文件进行一系列“搜索和替换”,比如 file.txt。例如,

s/foo/bar/g
s/abc/xyz/g
s/pqr/lmn/
g/string-delete/d 

等等。

我应该如何在脚本文件中编写所有这些操作,然后在目标 file.txt 上一次运行它们以将其保存到 newfile.txt?

我看到这篇文章Search and replace variables in a file using bash/sed但不知何故无法让它为我工作。

编辑:我更喜欢基于 vim/ed 的解决方案 Thanx tempora

4

4 回答 4

6

用于:source {file}运行 vim 脚本。

将您的命令保存到文件中,例如commands.vim. 然后打开要应用命令的缓冲区并commands.vim像这样获取文件:

:so commands.vim

注::so简称:source

如需更多帮助,请参阅:

:h :so
于 2013-05-02T14:04:39.780 回答
3

您可以将命令放在文件中并将其传递给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↵
于 2015-05-23T18:46:17.270 回答
2

您可以编写一个函数来包装这些命令,然后调用该函数。

注意!!

下面的函数是一个例子,我在你的cmd%前面添加了。s因为我猜您想在整个缓冲区上进行替换,而不是在“当前”行上。但是你必须小心,这样,如果后面的模式匹配,前面的替换结果可能会被后面的命令再次替换。只需根据您的需要进行调整。

例如考虑:

文本: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()
于 2013-05-02T13:48:46.127 回答
0

一种简单快捷的方法是将命令复制到寄存器中"ay,然后将寄存器作为运行@a

于 2013-05-02T14:00:21.653 回答