2015-02-10 144 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' {} \;