作者 主題: 请教一个VIM中使用正则表达式替换单词的问题  (閱讀 4852 次)

0 會員 與 1 訪客 正在閱讀本文。

tank22119

  • 可愛的小學生
  • *
  • 文章數: 2
    • 檢視個人資料
本人不才,刚踏入LINUX学习不久,现通过VIM用户手册自学VIM,OS为UBUNTU10.10,VIM版本7.2
简单起见单独列出问题,有如下风格的一篇c语言文档:
//This program print "Hello World!"
int main(void){
        printf("Hello World!");        //This line used to print "Hello World!"
        exit(EXIT_SUCCESS);
}

现在我想用VIM的global命令配合substitute命令替换注释中的"Hello World!"为something;
如果采用%g-//-s/\"Hello World!\"/something/g的方式替换,那么printf中的内容也会被替换;
我的个人理解global属于行级命令,也许只能在s///g的部分上想办法,可是我实在是想不到什么好办法,有谁有好点子吗?

gwstudy

  • 活潑的大學生
  • ***
  • 文章數: 205
    • 檢視個人資料
//This program print "Hello World!"
int main(void){
        printf("Hello World!");        //This line used to print "Hello World!"
        exit(EXIT_SUCCESS);
}

现在我想用VIM的global命令配合substitute命令替换注释中的"Hello World!"为something;
...

sed 's#\(//.*\)"Hello World!"#\1something#'

tank22119

  • 可愛的小學生
  • *
  • 文章數: 2
    • 檢視個人資料
多谢楼上的耐心回答,其实后来想想我的需求还没完全表达清楚……
实际情况是这样:
//Professor Smith criticized Professor Johnson today.
Professor Smith criticized //Professor Johnson today.
你的方法是要在VIM中使用!调用shell命令么?我试了下直接使用并没有成功,使用g-//-!sed ...这样的形式还是没有成功……
我自己后来也想了一个方法,和你提供的正则表达式思路差不多都是使用反向引用但是没有你的表达式简练。
g-//-s=\(//.*\)\(Professor\)=\1Teacher=g,但是还有个问题,第一行的两个Professor想要都替换成Teacher必须要执行两次命令,如果正式使用的话可能要存到寄存器中再使用999@a这样的形式确保全部替换成功,不知还有没有一劳永逸的办法。