我正在为一个讲师重构一堆PHP代码。我决定做的第一件事是更新所有按照Drupal SQL编码约定编写的SQL文件,也就是说,使用全大写关键字。我写了一些正则表达式:
:%s/create table/CREATE TABLE/gi
:%s/create database/CREATE DATABASE/gi
:%s/primary key/PRIMARY KEY/gi
:%s/auto_increment/AUTO_INCREMENT/gi
:%s/not null/NOT NULL/gi
好的,这是一个开始。现在我只需在Vim中打开每个SQL文件,运行所有五个正则表达式,然后保存。这感觉就像是五倍的工作量。它们可以复合成一个冗长但容易复制粘贴的正则表达式吗?
为什么要用vim呢?那么sed/awk呢?
。使用sed
sed -e 's/create table/U&/g' -e's/not null/U&/g' -e 's/.../U&/' *.sql
顺便说一句,在vi中你可以做
:%s/create table/U&/g
更改大小写,我们将节省一些输入。
如果你真的想在vi中执行一个很长的命令,也许你可以试试:
:%s/create table|create database|foo|bar|blah/U&/g
-
打开包含该替换命令的文件。
-
复制其内容(默认情况下到未命名寄存器):
:%y
-
如果只有一个文件应该替换执行后,像往常一样打开它并运行该寄存器的内容作为普通模式命令:
:@"
-
如果有几个文件要自动编辑,打开它们文件作为参数:
:args *.sql
-
对参数列表中的每个文件执行抽取替换:
:argdo @"|up
(
:update
命令在替换之后运行,写如果文件的缓冲区被修改过,则返回给文件。
虽然sed可以处理您想要的东西(但是它可以在您通过标志'i'请求时进行交互),但vim仍然非常强大。一旦我需要在1M SLOC代码库中更改一些函数调用中的最后一个参数。参数可以在一行中,也可以在几行中。在vim中,我很容易做到这一点。
你可以在vim中打开所有的php文件:
vim *.php
之后以ex模式运行:
:bufdo! %s/create table/CREATE TABLE/gi
重复其余命令。最后保存所有文件并退出vim:
:xall