2017-05-12 15 views
-1

a.cpp動態時的grep

int main() 
{ 
    bool b; 
    bool c = true; 

    bool d; 
    bool e ; 
    bool f ; 

    int x = 3; 

    std::cout << "x is " << x << std::endl; 
    return 0; 
} 

grepping對於具有布爾變量,而無需定義C文件的輸出替換節目的內容。

grep -rn --include \*.cpp --include \*.c bool | grep -v 'svn\|virtual\|::' | grep 'bool\([ ]\+[A-Z0-9a-z_]*[ ]*\);' 

輸出

a.cpp:3:  bool b; 
a.cpp:6:  bool d; 
a.cpp:7:  bool e ; 
a.cpp:8:  bool f ; 

現在我想使用命令這些行修改,以

bool b=false; 
bool d=false; 
bool e=false; 
bool f=false; 

有人可以提出一種方法。由於

回答

1

以下命令將直接替換文件並創建備份文件名.BAK,-i.BAK,-i不帶擴展名不會備份。

directory_path必須與路徑.如果當前

find directory_path \(-name '*.c' -o -name '*.cpp' \) -exec perl -i.BAK -pe ' 
    s/^(\s+bool\s+\w+)\s+(;)\s+$/$1=false$2/ 
' {} + 

更換恢復,如果出現錯誤

find directory_path -name '*.BAK' -exec bash -c 'mv $1 ${1%.BAK}' -- {} \; 

除去.BAK

find directory_path -name '*.BAK' -exec rm {} + 

注:差異find +或的最後一個參數是因爲{}將被替換爲命令行可以包含的參數(如xargs),所以最後{}查找將分叉較少的進程與+

+0

嗨,它正在工作,但不是完全... bool b = false; bool c = true; bool d = false; bool e; bool f; e,f不會更改它們的值 – naren

+0

我忘記了'\(\)'圍繞'-name -o -name',* .c文件未處理更新 –

+0

@naren在您的評論之後,分號後是否有空格';'和在新行之前 –

0

你可以試試這個sed

sed -i.bak 's/^\(\s*bool \+[a-zA-Z0-9_]\)\s*;$/\1=false;/' my.cpp 

注:第一次嘗試使用示例文件。然後在實時源代碼中應用。