vim查找多个文件及替换

http://www.xitongzhijia.net/xtjc/20150602/49878.html

vim是Linux系统下常用的文本编辑,通过使用多种shell命令能够实现多文件的查找和替换,那么具体会使用到那些命令呢?下面小编就给大家介绍下Linux系统vim多文件查找和替换的方法。

Linux使用vim进行多文件查找和替换的方法

在linux平台上,有很多优秀的shell命令组合来做多文件查找/替换,比如这些命令:find,sed,grep,awk,perl。但其他平台比如windows上就没那么方便了,这时候vim内置的多文件查找命令就有用武之地了,虽然比起外部命令来稍微慢了一点。

vim 多文件查找

这个vim内置命令就是vimgrep,有两种基本的使用方式:

:vim[grep][!] /{pattern}/[g][j] {file} 。。。

:vim[grep][!] {pattern} {file} 。。。

file部分支持通配符,*代表当前目录,**代表当前目录及其子目录(递归),比如*/*.c代表当前目录下的c源程序文件,**/*.c代表当前目录及其递归子目录下的所有源程序文件。file部分可以指定多次。

以下命令查看匹配结果:

:cn[ext] 下一个结果

:cp[revious] 上一个结果

:cw[indow] quickfix窗口,结果文件列表

更详细的用法参见:help vimgrep 和下面的refs。

vim 多文件替换

实际上只要如下两个命令即可(假设要将当前目录下所有扩展名为.txt/.cpp的文件中的hate替换成love):

:args *.txt *.cpp :argdo %s/hate/love/gc | update

:args *.txt *.cpp

:argdo %s/hate/love/gc | update

完成,解释如下:

:args *.txt *.cpp

:args *.txt *.cpp

这样写会扫描当前目录下的.txt 和 .cpp文件,并加入到参数列表。但是这样写只会稻苗当前目录,如果想要递归扫描所有下级目录的话,用

:args **/*.txt

:args **/*.txt

如果只想扫描下一级目录(即不扫描当前目录)的话,用

:args */*.txt

:args */*.txt

:argdo %s/hate/love/gc | update

:argdo %s/hate/love/gc | update

是将参数列表中的所有文件的hate提换成love,并写入硬盘(如果没有|update,就不会写入,但相应的替换也会被中断)。

最后强调一点,使用替换命令的时候,一定记得备份,因为替换是直接写入硬盘。

上面就是Linux系统vim多文件查找和替换的方法介绍了,通过find,sed等命令能够实现多文件的相关处理,你也可使用vim内置的多文件查找命令。

打开vim

/Pragmatic\ze Vim  #查找Pragmatic Vim,使用\ze那么vim不被匹配,只匹配到Pragmatic,其他包含Pragmatic但不包含Vim的不会搜索到

:%s//Practical/g       #先查询然后替换,单个文件

:set hidden              #设置set hidden,那么文件编辑后无需保存,即可跳转至别的文件

:args **/*.txt             #将目录及子目录下的所有的txt文件加入缓冲区,与:ls类似

:argdo %s//Practical/gec         #替换但不写入,e表示找不到不会报错,c弹出确认框,g文件所有的行

:argdo %s//Practical/gec|update  #替换并且写入

转:http://blog.chinaunix.net/uid-23381466-id-93905.html

1、多文件查找
1.1、grep
       直接在vim中输入:grep abc * 这是直接调用unix下的grep命令
1.2、vimgrep
       基本用法就是
       :vimgrep /匹配模式/[g][j] 要搜索的文件/范围
       :vim[grep][!] /{pattern}/[g][j] {file} ...
       g 和 j 是两个可选的标志位,g表示是否把每一行的多个匹配结果都加入。j表示是否搜索完后定位到第一个匹配位置。
       要搜索的文件 可以是具体的文件路径,也可以是带通配符的路径比如 *.as **/*.as ,**表示递归所有子目录。 要搜索的文件和或搜索范围都可 以写多个,用空格分开。

例子:
:vimgrep /\<flash\>/ **/*.as 搜索当前目录以及所有子目录内as文件中的 "flash"
:vimgrep /an error/ *.c 就是在所有的.c文件中搜索an error。
:vimgrep/an error/* 意思是查找当前目录下的文件中的an error,不包括子目录
1.3、定位
       输入上述的命令后,可以像输入:make命令,那样定位匹配到的文件位置
       :cnext (:cn)           下一个匹配位置
       :cprevious (:cp)     上一个匹配位置
       :cwindow (:cw)     quickfix窗口,可以选择匹配的文件位置
       :cl(:clist)                查看所有匹配的位置

2、多文件替换(arg)
a、加入要处理的文件  :args *.txt
b、输入对上述文件的动作  :argdo %s/hate/love/gc | update  (这里将hate替换成love,update表示要写入到文件中,否则只作替换而不写入)

转:http://blog.csdn.net/lyd518/article/details/18961793

假定你有个变量名为 "x_cnt" 而你要把他改为 "x_counter"。这个变量在多个 C 文件都 
被用到了。你需要在所有文件中作此改动。你得这么做。 
   把所有相关文件放进参数列表: >
    :args *.c 

这个命令会找到所有的 C 文件并编辑其中的第一个。现在你可以对所有这些文件执行 
置换命令: >
    :argdo %s/<x_cnt>/x_counter/ge | update
命令 ":argdo" 把另一个命令当作其参数。而后者将对参数列表内所有的文件执行。 
   作为参数的替换命令 "%s" 作用于所有文本行。它用 "\<x_cnt\>" 来查找 
"x_cnt"。 "\<" 和 "\>" 用来指定仅匹配那些完整的词,而不是 "px_cnt" 或 
"x_cnt2"。 
   替换命令的标记中包含 "g",用以置换同一行文本内出现的所有的匹配词 "x_cnt"。 
标记 "e" 用于避免因文件中找不到 "x_cnt" 而出现错误信息。否则 ":argdo" 命令 
就会在遇到第一个找不到 "x_cnt" 的文件时中断。 
   字符 "|" 分隔两条命令。后面的 "update" 命令将那些有改动的文件存盘。如果 
没有 "x_cnt" 被改成 "x_counter",这个命令什么也不做。
还有一个 ":windo" 命令,用于在所有视窗内执行其参数所规定的命令。以及 ":bufdo"  
命令,对所有缓冲执行其参数所规定的命令。使用中要小心,因为你在缓冲列表中的文 

件数量可能超过你能想像的。请用 ":buffers" 命令 (或 ":ls") 来检查缓冲列表。 

2. 同时打开不同文件目录的文件

:n **/filename   **/css/filename

    A+
发布日期:2021年07月26日  所属分类:未分类

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: