我有一个复杂的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