我有几个文本文件。所有这些文本文件都需要经过一系列编辑,可以在vim
.我想自动化这个。vim
有几个替换命令。假设文本文件需要进行以下替换:
- 用男孩替换男孩:
%s/boy/Boy/g
- 用女孩替换女孩:
%s/girl/Girl/g
- 删除空行:
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'