复合开关在Vim中的正则表达式



我正在为一个讲师重构一堆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
  1. 打开包含该替换命令的文件。

  2. 复制其内容(默认情况下到未命名寄存器):

     :%y
    
  3. 如果只有一个文件应该替换执行后,像往常一样打开它并运行该寄存器的内容作为普通模式命令:

     :@"
    
  4. 如果有几个文件要自动编辑,打开它们文件作为参数:

     :args *.sql
    
  5. 对参数列表中的每个文件执行抽取替换:

     :argdo @"|up
    

    (:update命令在替换之后运行,写如果文件的缓冲区被修改过,则返回给文件。

虽然sed可以处理您想要的东西(但是它可以在您通过标志'i'请求时进行交互),但vim仍然非常强大。一旦我需要在1M SLOC代码库中更改一些函数调用中的最后一个参数。参数可以在一行中,也可以在几行中。在vim中,我很容易做到这一点。

你可以在vim中打开所有的php文件:

vim *.php

之后以ex模式运行:

:bufdo! %s/create table/CREATE TABLE/gi

重复其余命令。最后保存所有文件并退出vim:

:xall

最新更新