我有一个文件夹“模型”。在其中,我需要将术语“Test_Dbv3”的所有实例替换为“TestDbv3”。有多个文件,名称如 test_host.hbm.xml、test_host2.hbm.xml、testHost.java、testHost2.java 等。有什么方法可以使用 Unix 命令或任何语言的脚本来做到这一点?
我正在研究 RHEL5。
sed
在就地模式下find
应该可以工作:
find . -type f -exec sed -e 's/Test_Dbv3/TestDbv3/g' -i.bak '{}' +
恰当命名的find
命令查找文件。在这里,我们在当前工作目录 ( .
) 中查找文件 ( -type f
)。使用这些文件,我们将执行-exec
一个命令:sed
. +
表示命令的结束,并且我们想{}
用操作系统允许的尽可能多的文件替换。
sed
将逐个文件,逐行执行我们指定的命令。我们给它的命令是,它翻译为“用文本s/Test_Dbv3/TestDbv3/g
替换正则表达式的匹配,允许每行多次替换”。用结果替换原始文件的方法,将未修改的版本保存为文件名后缀为.Test_Dbv3
TestDbv3
-i.bak
.bak
s/_//g
是你的正则表达式假设你想要全部_
消失吗?否则我需要猜测如何指定你的正则表达式:
例如,如果它们位于行首,则s/^(Test|test)_/$1/g
替换test_
为test
和
。Test_
Test
或者s/^(test)_/$1/gi
将另外适用于所有TEST_
,tEsT_
等。
如果您决定需要完全不区分大小写的匹配,该匹配仅适用于 forperl -pi -e 's/.../.../gi'
或 GNUsed
或更多,但不适用于sed
命令(甚至不是像$1
are 这样的变量,是吗?)
如果还有以 likeTest2_
或1EXPERIMENT_
更多单词开头的文件名,您可能会使用它 s/^([A-Za-z0-9]{3,10})_/$1/g
来匹配长度为 3 到 10 个字符的字母和数字的每个组合,而不仅仅是您提到的Test
or 。test
对于更具体的正则表达式搜索“正则表达式备忘单”,只要您决定使用它们,就不要怀疑单一工具何时喜欢sed
或grep
不支持所有东西。
如果您还需要一个命令来仅重命名文件夹中的文件,但不编辑它们的内容,您可以尝试
rename 's/search/relace/' folder/*
(不匹配子目录)或rename search replace folder/*
(取决于重命名的版本)。