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

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

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

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

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

答案1

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

的替换语法sed与 的替换语法基本相同vi

 sed -i.backup 's/boy/Boy/g' file-name-1 file-name-2 ...

答案2

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

vi -s edit.vim  test.txt

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

:%s/boy/Boy/g
:%s/girl/Girl/g
:g/^$/d
:wq

其中 test.txt 包含

boys & girls

boys & girls
boy & girl

boys & girls

这是一个通用的 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

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

:source clean.vim

答案3

为什么不使用sed

使用 sed 您可以轻松循环目录中的文件:

for f in *.txt
do
sed 's/boy/Boy/g;s/girl/Girl/g;/^\s*$/d' $f > tmp
mv tmp $f
done

上面的示例将更改 boy->Boy、girl->Girl 并删除空行。

答案4

和一个内联vi脚本:

$ vi test.txt -c '%s/boy/Boy/g | %s/girl/Girl/g | g/^$/d | wq'

相关内容