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
因为afairsed
可以遍历目录树本身
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/“{\”;