如何使用sed替换以下文本?

时间:2012-07-10 10:39:04

标签: shell sed replace

您好我想替换document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));

(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();

在所有事件中......

所以我在下面的代码中使用了这个。

find /cygdrive/c/xampp/htdocs/news -type f -exec sed -i s#document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));#(function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})();#g {} \;

但它没有取代。逃跑有什么问题吗?

由于

4 个答案:

答案 0 :(得分:1)

  

sed -i“s / ^ document.write(unescape(。*; $ /(function(){var ga = document.createElement('script'); ga.type ='text / javascript'; ga。 async = true; ga.src =('https:'== document.location.protocol?'https:// ssl':'http:// www')+'。google-analytics.com / ga.js' ; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga,s);})(); /“example.txt

答案 1 :(得分:1)

嗯,第一步是单独检查sed命令:

  

bash:意外令牌附近的语法错误`('

您必须将sed命令放入单引号或双引号中,以便将其作为单个参数传递给sed应用程序's#docum....'。如果单引号内有单引号,或双引号内有双引号,则必须将其转义。

请注意,该命令看起来很丑陋,不易读取或维护,我会使用python或ruby,你会有特殊的引号来帮助克服字符串转义的问题......

答案 2 :(得分:1)

您需要将参数引用到sed,并转义任何嵌套引号。否则:

s#document.write(unescape("%3Cscript src='" + gaJsHost +  ...

将被shell分成单独的单词,而不是作为单个参数传递给sed。

您需要用引号括起整个sed脚本(s#from#to#部分),我会选择单引号,然后用'替换脚本中的每个\'

(另外,为什么你使用的是find -exec而不是我suggested?)

答案 3 :(得分:0)

即使不是直接答案,对于此类替换,您也可以使用“rpl”工具。 看起来你正在使用cygwin,因此你可以找到一个win32端口here