Bash 中的 Sed 困难模式

Bash 中的 Sed 困难模式

我有一个复杂的字符串需要搜索和替换

我需要更换:

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

相关内容