2015-02-10 164 views
1

我想遞歸循環我的項目文件夾,grep每個PHP文件並找到匹配xdebug_break();的任何字符串。Shell腳本Mac:通過目錄循環並刪除字符串

然後我想刪除那xdebug_break()(我會接受用空格替換)。

這是我走到這一步:

#!/bin/bash 
FILES=$(find ../../Dev/projects/api -type f -name *.php) 

for f in $FILES 
do 
    if grep -nr "xdebug_break();" $f 
    then 
     sed -e '/xdebug_break();/d' -i $f 
     echo "xdebug_break(); has been deleted." 
    fi 
done 

一切正常,除了更換部分。我不斷收到此錯誤:

sed: -i may not be used with stdin 

我不在乎,如果其sedawk或任何(但我使用的是Mac)。

感謝,

SOLUTION(FOR未來的讀者)

感謝大家的幫助(ESP @anubhava)。這一條線技巧爲我做:

find ../../Dev/projects/api -type f -name "*.php" -exec sed -i '' '/xdebug_break();/d' {} + 

您也可以通過循環做(如果你真的真的想)是這樣的:

#!/bin/bash 
FILES=$(find ../../Dev/projects/api -type f -name *.php) 

for f in $FILES 
do 
    if grep -nr "xdebug_break();" $f 
    then 
     sed -i '' '/xdebug_break();/d' "$f" 
     echo "xdebug_break(); has been deleted." 
    fi 
done 

回答

1

在OSX,你sed命令應該是:

sed -i.bak '/xdebug_break();/d' "$f" 

這裏.bak是在內聯編輯中創建輸入文件備份的擴展名。

你能避免循環,這樣做在一個find這樣的:

find ../../Dev/projects/api -type f -name "*.php" \ 
      -exec sed -i.bak '/xdebug_break();/d' {} + 
+0

反正不創建.bak文件使用SED? @anubhava – Shade 2015-02-10 19:33:57

+0

是的,當然。您可以使用'sed -i'''/ xdebug_break();/d'「$ f」' – anubhava 2015-02-10 19:35:16

+0

一行應該是:'find ../../Dev/projects/api-type f -name「*。 php「-exec sed -i'''/ xdebug_break();/d'{} +'否則:''find ../../Dev/projects/api-type f -name」* .php「 - exec sed -i'''/ xdebug_break();/d'{} \;'' – anubhava 2015-02-10 19:36:21

0

您可以結合findsed

find Dev/projects/api -type f -name '*.php' -exec sed -i.bak '/xdebug_break();/d' {} \;