3

我正在尝试递归查找多种类型的文件,并在找到的每个文件中替换某个字符串。但是当我运行脚本时,它只找到一种类型的文件。

我正在使用的命令行是这样的

find . -name '*.tcl' -o -name '*.itcl' -o -name '*.db' -exec sed -i 's/abc/cba/g' {} +

每次我运行上面的命令时,它只会找到类型为.db. 当我使用单一文件类型运行它时,它工作正常。

4

3 回答 3

6

您需要像这样对-names *部分进行分组()

此外,最好(根据我的经验)sed -i只在与模式匹配的文件上运行,所以:

find . \( -name '*.tcl' -o -name '*.itcl' -o -name '*.db' \) -exec sed -i '/abc/s/abc/cba/g' {} +
于 2012-10-15T19:48:23.030 回答
1

下面的命令将搜索 txt 或日志文件,并将源字符串替换为目标字符串。

 find . -name "*.txt" -o -name "*.log"|xargs perl -pe 's/source/target/g'

您可以通过在 perl 语句中添加 -i 来进行替换,如下所示:

find . -name "*.txt" -o -name "*.log"|xargs perl -pi -e 's/source/target/g'
于 2012-10-16T06:04:53.410 回答
0

你可以做:

find . -regex ".*\.\(tcl\|itcl\|db\)" -exec sed -i 's/abc/cba/g' {} +

这更紧凑,您不必弄乱 OR 和对逻辑操作进行分组。

于 2015-12-05T20:51:07.583 回答