Sed在Bash困难的模式

我有一个复杂的string,我需要search和replace

我需要replace:

common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar 

 #common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar,${catalina.home}/lib/ext,${catalina.home}/lib/ext/*.jar 

恐怕我不能使用python或任何其他脚本语言(我的bash脚本目前有100多行)

到目前为止,我有一个包含string的testing文件,我试图使用这个sed命令:

 #!/bin/sh sed -i 's:common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar:#common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar\ncommon.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar,${catalina.home}/lib/ext,${catalina.home}/lib/ext/*.jar:' workers.properties 

没有错误被抛出,但没有被replace。 我需要逃避string内的某些字符吗?

任何build议将有所帮助,谢谢!

更新:我使用的命令类似于乔的:

 sed -i -e 's:^\(common.loader=${catalina.base}/lib,${catalina.base}/lib/\*\.jar,${catalina.home}/lib,${catalina.home}/lib/\*\.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/\*\.jar$\):#\1\n\1,${catalina.home}/lib/ext,${catalina.home}/lib/ext/*.jar:' /etc/tomcat6/catalina.properties 

你需要逃避'*'的工作,你可能会想逃避'。 为了更加准确的匹配,句号将匹配任何字符,并且星号与任何数量的字符之间匹配。

这将做你需要的比赛:

 sed -e 's:^\(common.loader=${catalina.base}/lib,${catalina.base}/lib/\*\.jar,${catalina.home}/lib,${catalina.home}/lib/\*\.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/\*\.jar$\):#\1,${catalina.home}/lib/ext,${catalina.home}/lib/ext/*.jar:' workers.properties 

我逃脱了每个元字符(。和*)添加了锚(^和$),并使用了(和)的后引用,因此模式的旧部分可以被重用。

这是sed的一个体面的指南: http : //www.grymoire.com/Unix/Sed.html

这将做到这一点 – 在例如sed.script中使用以下sed命令创build一个文件

  /^common\.loader/ { s|^common|#common| a common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home} /lib,${catalina.home}/lib/*.jar,/var/lib/tomcat6/common/classes,/var/lib/tomcat6/common/*.jar,${catalina.home}/lib/ext,${catalina.home}/lib/ext/*.jar } 

然后像这样使用它

 sed -i -f sed.script filetoedit 

你可能要制作一个文件的副本,所以你可以这样调用它

 sed -i.bak -f sed.script filetoedit