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

时间:2011-07-20 08:18:51

标签: 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

7 个答案:

答案 0 :(得分:350)

您的查找应该是这样的,以避免将目录名称发送到sed:

find ./ -type f -exec sed -i -e 's/apple/orange/g' {} \;

答案 1 :(得分:68)

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

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

答案 2 :(得分:5)

这对我有用:

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

答案 3 :(得分:2)

grep -e apple your_site_root/**/*.* -s -l | xargs sed -i "" "s|apple|orage|"

答案 4 :(得分:1)

我认为我们可以用一行简单命令

来做到这一点
for i in `grep -rl eth0 . 2> /dev/null`; do sed -i ‘s/eth0/eth1/’ $i; done

请参阅此page

答案 5 :(得分:0)

由于也有macOS的人正在阅读此书(就像我一样),因此以下代码对我有用(在10.14上)

egrep -rl '<pattern>' <dir> | xargs -I@ sed -i '' 's/<arg1>/<arg2>/g' @

使用-i-e的所有其他答案在macOS上不起作用。

Source

答案 6 :(得分:-3)

在linuxOS中:

sed -i 's/textSerch/textReplace/g' namefile

如果“sed”不起作用,请尝试:

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