Shell 脚本 Mac:遍历目录并删除字符串

Shell Script Mac: Loop through Directory and Remove String

我正在尝试递归循环我的项目文件夹,grep 每个 PHP 文件并找到匹配 xdebug_break();.

的任何字符串

然后我想删除 xdebug_break()(我也接受用 space 替换)。

这是我目前得到的结果:

#!/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

在 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' {} +

您可以组合 findsed:

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