我运行此命令以在我的站点根目录中的所有文件中查找所有出现的“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 ./
并发布一些示例输出吗?和目录结构请。编辑:谢谢!
您的 find
应如下所示以避免将目录名称发送到 sed
:
find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;
对于较大的 s&r 任务,使用 grep 和 xargs 会更好更快,例如;
grep -rl 'apples' /dir_to_search_under | xargs sed -i 's/apples/oranges/g'
git grep -l 'apples' | xargs sed -i 's/apples/oranges/g'
会更快
xargs sed -i '' 's/apples/oranges/g'
sed
和 |
而不是 /
,例如 ... xargs sed -i 's|mduuid/apples|mduuid/oranges|g'
stackoverflow.com/questions/40714970/…
由于也有 macOS 人在阅读这个(就像我一样),所以下面的代码对我有用(在 10.14 上)
egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @
使用 -i
和 -e
的所有其他答案都不适用于 macOS。
这对我有用:
find ./ -type f -exec sed -i '' 's#NEEDLE#REPLACEMENT#' *.php {} \;
*.php
确实不正确;您很幸运,它没有在起始目录中扩展,因为您碰巧在那里没有任何匹配的文件。
find
命令上的 -name *.php
获得对文件名的限制。
grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"
我认为我们可以用一行简单的命令来做到这一点
for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done
请参阅此page。
为此找到了一个很棒的程序,名为 ruplacer
https://github.com/dmerejkowsky/ruplacer
用法
ruplacer before_text after_text # prints out list of things it will replace
ruplacer before_text after_text --go # executes the replacements
它还尊重 .gitignore
,因此它不会弄乱您的 .git
或 node_modules
目录(默认情况下 find .
将进入您的 .git 目录并可能损坏它!!!)
在 Linux 操作系统中:
sed -i 's/textSerch/textReplace/g' namefile
如果“sed”不起作用,请尝试:
perl -i -pe 's/textSerch/textReplace/g' namefile
不定期副业成功案例分享
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 上不起作用。touch a b c d e
后跟上面的命令会生成如下目录列表:a a-e b b-e c c-e d d-e e e-e
。RE error: illegal byte sequence
'{}'
,因为如果没有引用,fish 会自动扩展空括号。