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' {} +
您可以组合 find
和 sed
:
find Dev/projects/api -type f -name '*.php' -exec sed -i.bak '/xdebug_break();/d' {} \;
我正在尝试递归循环我的项目文件夹,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' {} +
您可以组合 find
和 sed
:
find Dev/projects/api -type f -name '*.php' -exec sed -i.bak '/xdebug_break();/d' {} \;