【问题标题】:Shell Script Mac: Loop through Directory and Remove StringShell Script Mac:遍历目录并删除字符串
【发布时间】:2015-04-10 23:37:41
【问题描述】:

我正在尝试递归循环我的项目文件夹,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

【问题讨论】:

    标签: macos bash shell awk sed


    【解决方案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' {} +
    

    【讨论】:

    • 无论如何使用 sed 而不创建 .bak 文件? @anubhava
    • 是的,当然。你可以使用sed -i '' '/xdebug_break();/d' "$f"
    • 一行应该是: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' {} \;
    【解决方案2】:

    你可以结合findsed

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-22
      • 2015-05-29
      • 2012-01-13
      • 2014-08-05
      • 1970-01-01
      • 2021-12-28
      • 2018-03-16
      • 1970-01-01
      相关资源
      最近更新 更多