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