Unix命令替换文件夹中每个文件中的所有字符串实例

时间:2013-06-15 02:37:35

标签: string shell unix replace

我有一个文件夹“model”。在其中,我需要将术语“Test_Dbv3”的所有实例替换为“TestDbv3”。有多个文件的名称如test_host.hbm.xml,test_host2.hbm.xml,testHost.java,testHost2.java等。有没有办法可以使用Unix命令或任何语言的脚本来做到这一点?

我正在研究RHEL5。

2 个答案:

答案 0 :(得分:18)

就地模式中的

sedfind应该可以正常工作:

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/gtest_替换为testTest_ 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个字符的数字组合,而不仅仅是您提到的testsed

  • 对于更具体的正则表达式搜索“正则表达式cheatsheet”,并且不要怀疑像greprename 's/search/relace/' folder/*这样的单个工具何时不支持所有内容,如果您决定使用它们

  • 您是否还需要一个命令来仅重命名文件夹中的文件, 但不要编辑他们可能尝试的内容 rename search replace folder/*(不匹配子目录) 或{{1}}(取决于重命名的版本)。