我有一个复杂的字符串需要搜索和替换
我需要更换:
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 多行)
到目前为止,我有一个包含相关字符串的测试文件,并且我正在尝试使用这个 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
没有抛出任何错误,但也没有替换任何内容。我需要转义字符串中的某些字符吗?
任何建议都会有帮助,谢谢!
更新:我使用的命令与Joe的类似:
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
答案1
您需要转义“*”才能使其工作,您可能希望转义“。”以实现更准确的匹配,句点将匹配任何字符,星号将匹配任意数量的字符之间。
这将完成您需要的匹配:
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
答案2
这样就可以了 - 使用以下 sed 命令创建一个文件,例如 sed.script
/^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