Shell脚本Mac:循环目录和删除字符串

时间:2015-02-10 19:25:20

标签: macos bash shell awk sed

我试图以递归方式循环我的项目文件夹,grep每个PHP文件并找到与xdebug_break();匹配的任何字符串。

然后我想删除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

我不关心它是sed还是awk还是其他什么(但我确实使用了mac)。

谢谢,

解决方案(针对未来的读者)

感谢大家的帮助(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

2 个答案:

答案 0 :(得分: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' {} +

答案 1 :(得分:0)

您可以合并findsed

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