【发布时间】:2013-10-29 17:31:07
【问题描述】:
关于this post,我如何将一个或多个文件排除在应用字符串替换之外?以上述帖子为例,我希望能够在给定目录除了的所有后代文件中将“apples”替换为“oranges”,例如./fpd/font/symbol.php。
我的想法是在 find 命令中使用 -regex 开关,但不幸的是它没有像 grep 命令那样的 -v 选项,因此我不能将正则表达式否定为 not匹配必须发生替换的文件。
【问题讨论】:
关于this post,我如何将一个或多个文件排除在应用字符串替换之外?以上述帖子为例,我希望能够在给定目录除了的所有后代文件中将“apples”替换为“oranges”,例如./fpd/font/symbol.php。
我的想法是在 find 命令中使用 -regex 开关,但不幸的是它没有像 grep 命令那样的 -v 选项,因此我不能将正则表达式否定为 not匹配必须发生替换的文件。
【问题讨论】:
我在我的 Git 存储库中使用它:
grep -ilr orange . | grep -v ".git" | grep -e "\\.php$" | xargs sed -i s/orange/apple/g {}
它会:
.git文件夹;.php 文件。不用说,您可以包含任意数量的grep 层,以过滤传递给xargs 的列表。
已知问题:
至少在我的 Windows 环境中,它无法打开路径或名称中有空格的文件。从来没想过那个。如果有人知道如何解决这个问题,我想知道。
【讨论】:
default="myApp"; grep -Rl $default . | grep -v ".git" | grep -v "angular.js" | grep -v $0 | xargs sed -i "s/$default/somethingElse/g"; 基本上 id 所做的是将 angularjs-seed 应用程序(“myApp”)的默认名称替换为整个项目中的其他名称(可以是用户定义的),除了 .git 内部文件夹、文件 angular.js(它作为示例出现在注释块中)和脚本本身。很好的答案! :)
sed: can't read {}: No such file or directory 所以我省略了它,它就像一个魅力!
尚未对此进行测试,但应该可以:
find . -path ./fpd/font/symbol.php -prune -o -exec sed -i 's/apple/orange/g' {} \;
【讨论】:
您可以将!(或-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
【讨论】: