2012-11-18 71 views
1

我是using sed and grep to search and replace boost :: shared_ptr與std :: shared_ptr。我如何保留egrep滿分.svn。它導致局部損壞:使用sed和grep來搜索和替換(跳過.svn或.git)

Transmitting file data .svn: E155017: Commit failed (details follow): 
svn: E155017: Working copy text base is corrupt 
svn: E200014: Checksum mismatch for text base of '/home/jeffrey/owasp-esapi-cplusplus/doc/html/_codec_8cpp_source.html': 
    expected: 09ead67f10a06a392ec41455179da560 
    actual: 310ceca1a9c721b40db494f62854d2df 

傑夫

回答

4

我建議你使用的ack代替grep來搜索文件。它採用與grep相同的基本選項。

默認情況下,它將跳過.svn.git ...目錄&二進制文件。

例子:

ack -rl --print0 "pattern" . | xargs -0 -l sed -i 's/pattern/other_pattern/g' 

所以最後:

ack -rl --print0 "boost::shared_ptr" . | 
    xargs -0 -l sed -i 's/boost::shared_ptr/std::shared_ptr/g' 
+0

完美,謝謝。 – jww

+0

xargs -l已棄用。 -L 1符合POSIX標準。 – vergueishon

2

嘗試findxargs

find /path/to/basedir -name .svn -prune -o -iname '*.h' -print0 , -iname '*.cpp' -print0 | xargs -0 sed -i 's/boost::shared_ptr/std::shared_ptr/g'