【转】linux批量更新文件内容+【原创】转义时的问题

程序开发中,可能你会经常遇到批量替换文件内容的情况,如果你使用的是linux,那么恭喜你,你可以使用一下三种办法进行查找替换。

  方法一:
  find -name 'file.log' | xargs perl -pi -e 's|string1|string2|g'
  这里使用了perl语言,使用-e加上一段代码,从而批量地将当前目录及所有子目录下的file.log文件中的string1替换成了string2
  string支持正则表达式
 
  方法二:
  sed -i "s/string1/string2/g" 'grep string1 -rl /path'
  这里使用了sed命令,将/path目录及其子目录下的所有文件中的string1替换成了string2
  这个命令,可能对返回多个文件不太支持,不太推荐!
 
  方法三:
  grep -i "string1" -r /path | awk -F : '{print $1}' | sort | uniq | xargs sed -i 's/string1/string2/g'
  这里使用了shell命令,先查找出文件,再用awk分割(以:切分),再行替换! 
 
 
注意:
  grep可以使用正则,也可以使用\转义一些特殊字符,比如“等
  sed -i 's/\"localhost\"/\"10.2.2.2\"/g' /home/my.conf
-------------------------------------以上是原帖,地址:http://www.51testing.com/html/93/316693-815340.html-------------------------------------------------------
 
上司发现了一个sql注入的漏洞,让我批量更新所有同名文件的这个地方,where("id='".$rec."'")改成where(array("id"=>$rec))
因为我也是刚入门linux,所以马上百度方法,首先使用了sed -i "s/string1/string2/g" 'grep string1 -rl /path'
 
sed -i "s/where(\"id='\".\$rec.\"'\")/where(array(\"id\"=>\$rec))/g" `grep  -rl /home`
 
测试,执行,成功,心里乐呵呵的在正式服务器里执行了,当时快下班了,就关了屏幕撤退了。
第二天早上打开屏幕一看,我擦,还没执行完,一想确实,那么多文件屏幕显示也费劲了,然后又百度,
因为都是同名的文件,所以这次用了 find -name 'file.log' | xargs perl -pi -e 's|string1|string2|g'这个方法,
中间因为转义费了好久的事,
 
find /home/ -name 'xxxx.php' | xargs perl -pi -e "s|where\(\"id='\".\$rec.\"'\"\)|where\(array(\"id\"=>\$rec\)\)|g"  -> 错误
一开始写的是 \$rec 然后就是不成功,没办法只有百度转义,发现很多博文都有些为了转义\使用5678个\来转义他自己,恍然大悟,原来\$转义出来的还是$rec还是个变量,
 
find /home/ -name 'xxxx.php' | xargs perl -pi -e "s|where\(\"id='\".\\\$rec.\"'\"\)|where\(array(\"id\"=>\\\$rec\)\)|g" -> 正确
因为从双引号里先转义了\\\$,从双引号里出来时就已经是\$了,然后命令执行时再转义成了$rec,这下终于好了,测试成功,
执行了半分钟,全部替换完毕,

 

posted on 2014-09-19 11:59  yuBestman  阅读(311)  评论(0编辑  收藏  举报

导航