2

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

我正在研究 RHEL5。

4

2 回答 2

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_Dbv3TestDbv3-i.bak.bak

于 2013-06-15T02:40:48.973 回答
2

s/_//g 是你的正则表达式假设你想要全部_消失吗?否则我需要猜测如何指定你的正则表达式:

  • 例如,如果它们位于行首,则s/^(Test|test)_/$1/g替换test_test和 。Test_Test

  • 或者s/^(test)_/$1/gi 将另外适用于所有TEST_,tEsT_等。

  • 如果您决定需要完全不区分大小写的匹配,该匹配仅适用于 forperl -pi -e 's/.../.../gi' 或 GNUsed或更多,但不适用于sed命令(甚至不是像$1are 这样的变量,是吗?)

  • 如果还有以 likeTest2_1EXPERIMENT_ 更多单词开头的文件名,您可能会使用它 s/^([A-Za-z0-9]{3,10})_/$1/g 来匹配长度为 3 到 10 个字符的字母和数字的每个组合,而不仅仅是您提到的Testor 。test

  • 对于更具体的正则表达式搜索“正则表达式备忘单”,只要您决定使用它们,就不要怀疑单一工具何时喜欢sedgrep不支持所有东西。

  • 如果您还需要一个命令来仅重命名文件夹中的文件,但不编辑它们的内容,您可以尝试 rename 's/search/relace/' folder/* (不匹配子目录)或rename search replace folder/* (取决于重命名的版本)。

于 2013-06-16T06:11:52.503 回答