找到&除了某些文件之外,递归替换

时间:2013-10-29 17:31:08

标签: regex linux shell sed

关于this post,如何排除一个或多个文件应用字符串替换?通过使用上述帖子作为示例,我希望能够在给定目录的所有后代文件中将“apples”替换为“oranges”,除了,例如./fpd/font/symbol.php。< / p>

我的想法是在find命令中使用-regex开关,但不幸的是它没有像-v命令那样的grep选项,因此我无法否定正则表达式匹配必须进行替换的文件。

3 个答案:

答案 0 :(得分:1)

没有测试过这个,但它应该有效:

find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \;

答案 1 :(得分:1)

您可以使用!(或-not)与-name结合使用否定:

$ find .
.
./a
./a/b.txt
./b
./b/a.txt
$ find . -name \*a\* -print
./a
./b/a.txt
$ find . ! -name \*a\* -print
.
./a/b.txt
./b
$ find . -not -name \*a\* -print
.
./a/b.txt
./b

答案 2 :(得分:1)

我在我的Git存储库中使用它:

grep -ilr orange . | grep -v ".git" | grep -e "\\.php$" | xargs sed -i s/orange/apple/g {}

它会:

  1. 仅在实际包含要替换的单词的文件中运行查找和替换;
  2. 不处理.git文件夹;
  3. 仅处理.php个文件。
  4. 毋庸置疑,您可以包含尽可能多的grep个图层,以过滤传递给xargs的列表。

    已知问题:

    至少在我的Windows环境中,它无法打开路径或名称中包含空格的文件。从未想过那一个。如果有人知道如何解决这个问题,我想知道。