在VIM中复合开关正则表达式

时间:2011-09-22 20:26:15

标签: regex 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文件,运行所有五个正则表达式,然后保存。这感觉应该是它的五倍。他们可以复制到一个令人讨厌但很容易复制的正则表达式吗?

3 个答案:

答案 0 :(得分:6)

你为什么要在vim中这样做?怎么样sed / awk?

e.g。用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 :(得分:3)

  1. 打开包含该替换命令的文件。
  2. 复制其内容(默认情况下为未命名的寄存器),

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

    :@"
    

    如果要自动编辑多个文件,请将该文件打开为 参数,

    :args *.sql
    

    并对参数中的每个文件执行yanked替换 列表中,

    :argdo @"|up
    

    (替换后运行的:update命令,写入 如果已经更改,则提交缓冲区。)

答案 2 :(得分:0)

虽然sed可以处理你想要的东西(当你通过标志'i'请求时它可以是交互式的),vim仍然非常强大。一旦我需要在1M SLOC代码库中的某个函数调用中更改最后一个参数。参数可以是一行或多行。在vim中,我很容易实现它。

您可以一次打开vim中的所有php文件:

vim *.php

在ex模式下运行之后:

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

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

:xall