我有一个文件夹“model”。在其中,我需要将术语“Test_Dbv3”的所有实例替换为“TestDbv3”。有多个文件的名称如test_host.hbm.xml,test_host2.hbm.xml,testHost.java,testHost2.java等。有没有办法可以使用Unix命令或任何语言的脚本来做到这一点?
我正在研究RHEL5。
答案 0 :(得分:18)
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
。
答案 1 :(得分:2)
s/_//g
消失, _
是您的正则表达式;否则我需要猜测如何指定你的正则表达式:
例如s/^(Test|test)_/$1/g
将test_
替换为test
和
Test_
Test
s/^(test)_/$1/gi
如果它们位于一行的开头。
或TEST_
还适用于所有tEsT_
,perl -pi -e 's/.../.../gi'
等。
如果您决定需要完全不区分大小写的匹配,只能用于sed
或GNU sed
或更多而不是$1
命令(甚至不是变量Test2_
是,是吗?)
如果还有类似1EXPERIMENT_
或s/^([A-Za-z0-9]{3,10})_/$1/g
开头的文件名以及更多字词,您可以使用Test
来匹配字母和长度为3到10个字符的数字组合,而不仅仅是您提到的test
或sed
。
对于更具体的正则表达式搜索“正则表达式cheatsheet”,并且不要怀疑像grep
或rename 's/search/relace/' folder/*
这样的单个工具何时不支持所有内容,如果您决定使用它们
您是否还需要一个命令来仅重命名文件夹中的文件,
但不要编辑他们可能尝试的内容
rename search replace folder/*
(不匹配子目录)
或{{1}}(取决于重命名的版本)。