Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 在整个目录中用一个词替换另一个词-unix_Regex_Unix - Fatal编程技术网

Regex 在整个目录中用一个词替换另一个词-unix

Regex 在整个目录中用一个词替换另一个词-unix,regex,unix,Regex,Unix,我正在重构一些代码,我决定用另一个名称替换一个名称,比如说foobybar。它们出现在多个.cc和.h文件中,因此我想更改为: Foo key(); 到 就是这样,在Unix中将所有出现的Foo替换为Bar。并且这些文件位于同一目录中。我想到 sed -e {'s/Foo/Bar/g'} 但是我不确定这是否会起作用。您可能已经安装了perl(如果是UNIX的话),所以这里有一些东西应该适合您: perl -e "s/Foo/Bar/g;" -pi.save $(find path/to/D

我正在重构一些代码,我决定用另一个名称替换一个名称,比如说
foo
by
bar
。它们出现在多个
.cc
.h
文件中,因此我想更改为:

Foo key(); 

就是这样,在Unix中将所有出现的
Foo
替换为
Bar
。并且这些文件位于同一目录中。我想到

sed -e {'s/Foo/Bar/g'}

但是我不确定这是否会起作用。

您可能已经安装了perl(如果是UNIX的话),所以这里有一些东西应该适合您:

perl -e "s/Foo/Bar/g;" -pi.save $(find path/to/DIRECTORY -type f)
注意,如果您需要作为保险的话,这将提供原始文件的备份

否则,您可以按照@Kevin所说的做,只需使用IDE重构功能


注意:我刚才看到您正在使用Vim,下面是一个快速的

这应该可以做到:

sed -i'.bak' 's/\bFoo\b/Bar/g' *.files
我会使用sed:

sed -i.bak -e '/Foo/ s//Bar/g' /path/to/dir/*.cc

对*.h文件重复上述操作

我不经常使用sed,但是如果您可以在命令行上访问Perl(许多unix都这样做),则可以执行以下操作:

perl -pi -e 's/Foo key/Bar key/g' `find ./ -name '*.h' -o -name '*.cc'`

这将(递归地)查找当前目录中以.h或.cc结尾的所有文件,然后使用Perl将每个文件中的“Foo key”替换为“Bar key”。

我喜欢Jaypal的sed命令。它使用
\b
来确保只替换完整单词(
Foo
而不是
Foobar
),并在出现问题时生成备份文件

但是,如果您的所有文件不在一个目录中,那么您需要使用更复杂的方法来列出它们。使用find命令将它们全部发送到sed:

 find . -print0 -regex '.*\.\(cc\|h\)' | xargs -0 sed -i'.bak' 's/\bFoo\b/Bar/g'

使用具有重构功能的IDE。@Kevin我不能,我使用的是
VIM
,而且我远程登录到服务器。尽管我非常喜欢VIM,但使用
s//
进行重构是相当危险的。至少在vim中打开它们,并在文件替换中执行
:s/\/Bar/gc
@philippe
-i
选项。如果出现问题,您将拥有原始文件的备份,该备份将重命名为具有
.bak
扩展名。至少使用
find-print0/xargs-0
-exec
会更好
 find . -print0 -regex '.*\.\(cc\|h\)' | xargs -0 sed -i'.bak' 's/\bFoo\b/Bar/g'