如何转义下面的序列以便在shell脚本中使用sed替换文本?

时间:2012-07-10 10:03:48

标签: shell sed replace

find / cygdrive / c / xampp / htdocs / news4u -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'{} \;

这导致错误sed: -e expression #1, char 93: unknown option to s'`

我正在使用Windows并使用'cygwin'来运行shell脚本。

如何解决这个问题,应该单引号进行转义,因为它再次用单引号括起来?

2 个答案:

答案 0 :(得分:0)

退出/正则表达式中的sed(例如此处:google-analytics.com/ga.js)或使用其他分隔符(例如s^^^代替s///

答案 1 :(得分:0)

要逃避/,你可以使用另一个分隔符,正如伊戈尔所说。

喜欢

echo //// | sed 's@////@====@'

但是还有很多'也需要转义。

至少有两种方式:

第一个:

echo "111'222\"333" | sed 's/1'\''2/___/;s/2"3/__/;'

第二个:

echo "111'222" | sed "s/1'2/___/;s/2\"3/__/;"

你不能像'一样逃避'\'',因为'之间的关系绝对无关紧要。逃避角色在那里不起作用。因此,首先需要让转义字符从'转义,然后才能使用它。因此我们使用''\'''构造。 但是,转义字符可以正常使用"",因此您可以使用"\""

find /cygdrive/c/xampp/htdocs/news4u/apps/frontend/modules/alerts/templates \
-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" {} \;

应该可以正常工作。