用多个文件中的其他字符串替换多个字符串

Noo*_*oor 9 vim

我有几个文本文件。所有这些文本文件都需要经过一组编辑,可以在vim. 我想自动化这个。vim有几个替换命令。假设文本文件需要进行以下替换:

  1. 用男孩替换男孩: %s/boy/Boy/g
  2. 用女孩替换女孩: %s/girl/Girl/g
  3. 删除空行: g/^$/d

这只是一个简单的例子,有没有办法编写所有这些规则,然后在几个文件上自动执行?

Ant*_*hon 15

是的,有一种方法可以自动执行此操作。它从为工作选择正确的工具开始。
在这种情况下,您应该使用 egsed而不是试图弯曲vi它是为交互使用(而不是自动化)而设计的。

for 的替换语法与 for 的替换语法sed大致相同vi

 sed -i.backup 's/boy/Boy/g' file-name-1 file-name-2 ...
Run Code Online (Sandbox Code Playgroud)

  • `sed` 是一个 **stream** 编辑器,`vi` 是一个 _visual_ 文本 **file** 编辑器,构建在 `ex`/`ed` 之上(而 `s` 命令是一个 `ex` 命令在`vi`中)。大多数`sed` 实现没有`-i`。`ex` 和 `ed` 是标准的 Unix 命令。所以是的,它可以通过一些 sed 实现来完成,但这并不是说它是 _right_ 工具。 (4认同)
  • 我没有写 `sed` 是“正确的工具”。有多种工具,因此是“eg”。据我所知,`ed` 不会对多个文件进行操作,您必须在其标准输入上提供读写操作。然而,我记得最后一次使用 `ed` 是因为 `vi` 在 80 年代中期的 PDP-11 上不可用,所以我可能已经过时了它的功能 (3认同)
  • 显然这里有一个回声,其他 4 个人觉得完全可以说出你所做的 8-) (2认同)

zza*_*per 13

Vim 脚本 (gvim,vim) 可以很优雅并且很容易适应

vi -s edit.vim  test.txt
Run Code Online (Sandbox Code Playgroud)

其中 edit.vim 包含( :wq 是可选的)

:%s/boy/Boy/g
:%s/girl/Girl/g
:g/^$/d
:wq
Run Code Online (Sandbox Code Playgroud)

其中 test.txt 包含

boys & girls

boys & girls
boy & girl

boys & girls
Run Code Online (Sandbox Code Playgroud)

这是一个用于清理“脏”文本文件的通用 vim 脚本

:" clean.vim
:" clean up a text file
:" delete DOS returns (actually superfluous because of non-ASCII
deletion)
:%s/\r//eg
:" delete any non-ASCII including invisibles
:%s/[\x00-\x1f\x80-\xff]/ /eg
:" compress multiple spaces
:%s/\s\s\+/ /eg
:" delete end of line spaces
:%s/\s\+$//e
:" compress multiple blank lines
:v/./,/./-j
:" sort eliminating duplicate lines
:%sort -u
Run Code Online (Sandbox Code Playgroud)

请记住,您也可以从 vim 中获取脚本

:source clean.vim
Run Code Online (Sandbox Code Playgroud)