Linux 在目录和子目录中查找并替换为sed

Linux 在目录和子目录中查找并替换为sed,linux,command-line,sed,replace,Linux,Command Line,Sed,Replace,我运行此命令查找我的站点根目录中所有文件中出现的“apple”并将其替换为“orange”: find ./ -exec sed -i 's/apple/orange/g' {} \; 但它不通过子目录 这个命令有什么问题 以下是find./的一些输出行: ./index.php ./header.php ./fpd ./fpd/font ./fpd/font/desktop.ini ./fpd/font/courier.php ./fpd/font/symbol.php 您的find应该是

我运行此命令查找我的站点根目录中所有文件中出现的“apple”并将其替换为“orange”:

find ./ -exec sed -i 's/apple/orange/g' {} \;
但它不通过子目录

这个命令有什么问题

以下是
find./
的一些输出行:

./index.php
./header.php
./fpd
./fpd/font
./fpd/font/desktop.ini
./fpd/font/courier.php
./fpd/font/symbol.php

您的
find
应该是这样的,以避免将目录名发送到
sed

find./-type f-exec sed-i-e's/apple/orange/g'{}\;
这对我很有用:

find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;

我想我们可以用一行简单的命令来实现这一点

for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done

参考这一点。

对于较大的s&r任务,使用grep和xargs更好更快,例如

grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'
在linuxOS:

sed -i 's/textSerch/textReplace/g' namefile
如果“sed”无效,请尝试:

perl -i -pe 's/textSerch/textReplace/g' namefile

因为也有macOS的人在读这篇文章(和我一样),下面的代码对我很有用(在10.14上)


egrep-rl'| xargs-I@sed-I''s/

您能否运行
find./
并发布一些示例输出?还有目录结构。编辑:谢谢!Hm您的发现是正确的,适用于我的子目录。您如何知道它不处理子目录?因为它会出现以下错误:sed:无法编辑。/fpd:不是常规文件sed:无法编辑。/fpd/font:不是常规文件sed:无法编辑。/fpd/font/makefont:不是常规文件。。。我搜索了苹果,什么也没找到。它们都被替换了非常感谢。你睁开了我的眼睛!!!您可能需要将
sed-i's/apple/orange/g'
更改为
sed-i's/apple/orange/g'
,以使此功能正常运行。
-i
接受一个参数:用于保存临时文件的扩展名。在GNU sed中,看起来在
-i
和它的参数之间没有空格,但在BSD sed中有…所以BSD
-i''s/foo/bar/'
相当于GNU
-i's/foo/bar/
。实际上添加
-e
在Mac OS上不起作用
点击a b c d e
,然后按上面的命令生成如下目录列表:
a a-e b-e c c-e d d-e e e-e
。对于Mac OS,这回答了
错误:非法字节序列
对于鱼壳用户,请确保引用空大括号
“{}”
,因为如果不引用,fish会自动扩展空括号。谢谢你的回答,这非常有帮助!如果在git存储库中,使用
git grep-l'apples'| xargs sed-i's/apples/oranges/g'
会更快,如果在macos上,使用
xargs sed-i''s/apples/oranges/g'
他想找到子目录中包含该字符串的所有文件并进行替换,而不仅仅是单个文件原始问题不限于*.php文件,还有一个.ini,未加引号的
*.php
确实不正确;幸运的是,它没有在起始目录中展开,因为那里没有任何匹配的文件。可以通过
find
命令上的
-name*.php
获得对文件名的限制。
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"
egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @