当他们将递归文件搜索引入grep时,GNU人员真的搞砸了。 grep用于在文件中找到RE并打印匹配的行(g/re/p记住?)不用于查找文件。有一个非常好的工具,FINDing文件的名字非常明显。无论发生什么事,都要做一件事,做得好吗?
总之,这里是你会怎么做你想要使用传统的UNIX方式(未经测试):用AWK /指数(
find /path/to/folder -type f -print |
while IFS= read -r file
do
awk -v old="$oldstring" -v new="$newstring" '
BEGIN{ rlength = length(old) }
rstart = index($0,old) { $0 = substr($0,rstart-1) new substr($0,rstart+rlength) }
{ print }
' "$file" > tmp &&
mv tmp "$file"
done
这并不是说),而不是SED和grep你避免需要将所有可能出现在您的旧字符串或新字符串中的RE元字符都转义出来,并找出一个字符用作不能出现在旧字符串或新字符串中的sed分隔符,并且您不需要运行grep因为替换只会发生在包含所需字符串的文件中。说了这么多,如果你不想修改文件时文件的时间戳发生变化,那么只需在执行mv之前在tmp和原始文件上进行比较,或者在执行之前在fgrep -q中输入fgrep -q AWK。
警告:以上不适用于包含换行符的文件名。如果你有这些,那么让我们知道,我们可以告诉你如何处理它们。
方括号可能需要转义。也双引号sed模式。 – phs 2013-04-10 08:08:18
您的模式中的'/'也会出现问题。他们应该逃脱。或者你可以使用另一个分隔符作为命令(例如'@')。 – 2013-04-10 08:13:04