Shell 如何使用sed命令在子目录中递归搜索和替换?

Shell 如何使用sed命令在子目录中递归搜索和替换?,shell,command-line,replace,Shell,Command Line,Replace,我想搜索var-gaJsHost=((“https:==document.location.protocol)?”https://ssl." : "http://www.");并在主目录下的所有文件中将其替换为“google analytics code” 在php eclips编辑器中,它显示所有出现的情况,但不能一次替换所有出现的情况。 所以,我正在考虑使用shell脚本 /home/project/news4u/web是我的rot目录,以及如何使用sed命令来实现它 我尝试了sed s/'

我想搜索
var-gaJsHost=((“https:==document.location.protocol)?”https://ssl." : "http://www.");
并在主目录下的所有文件中将其替换为“google analytics code”

在php eclips编辑器中,它显示所有出现的情况,但不能一次替换所有出现的情况。 所以,我正在考虑使用shell脚本

/home/project/news4u/web是我的rot目录,以及如何使用
sed
命令来实现它


我尝试了
sed s/'var gaJsHost=((“https:==document.location.protocol)?”https://ssl." : "http://www.");'/'google analytics'*

如果您使用了GNU,它有一个
-i
选项,可以就地编辑文件。 如果您有
bash
,则需要启用globstar:

shopt -s globstar
因为afair
sed
可以遍历目录树本身

sed -i.bak "s@'var gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : "http://www.");'@'google analytics'@" **
-i.bak
将备份扩展名为
.bak
的每个文件。如果有什么地方出了问题,它是有用的

我建议您首先在某个特定文件上使用“无
-I
运行”选项检查是否一切正常,然后再使用
-I
运行

注:如果您没有GNU-sed或bash或两者都有,您可以使用更复杂的方式,但POSIX兼容方式:

find . -type f -exec sed "s@'var gaJsHost = ((\"https:\" == document.location.protocol) ? \"https://ssl.\" : "http://www.");'@'google analytics'@" {} > {}.tmp \; -exec mv {}.tmp {} \;

我尝试了sed“s@'var gaJsHost=((\“https:\”==document.location.protocol)?\“\”:“analytics'@”**它给出了错误sed:read error on CVS:是一个目录..目录结构如下:/apps/module/alert/template/{template1.php,template2.php..)template/template/cvs下还有一个cvs文件夹。请尝试此文件夹
find.-type f-exec sed“s@'var gaJsHost=(\“https:\”==document.location.protocol)?\”https://ssl.\" : "http://www.“@'google analytics'@{}”\;
下面的这个替换了“sed-i s/gaJsHost/google analysis/”,现在我需要的是一个递归调用,它将源名称和dest名称放在同一个位置。如果像sed-i s/manoj/gaJsHost/emp.php emp.php一样传递给maualy,它工作得很好
find/home/project/news4u/web-type f-exec sed-i s/gaJsHost/google analysis/{}\;
您需要用双引号引用sed命令,并转义其中的所有双引号:
find/home/project/news4u/web-type f-exec sed-i“s/var gaJsHost=((\“https:\”==document.location.protocol)?\“ssl.”;:\“\”)/google analysis/“{\”;