Назад | Перейти на главную страницу

Сед в Баше сложный паттерн

У меня сложная строка, которую мне нужно найти и заменить

Мне нужно заменить:

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

Ошибок не возникает, но и ничего не заменяется. Нужно ли мне экранировать определенные символы внутри строки?

Любой совет поможет, спасибо!

ОБНОВЛЕНИЕ: использованная мной команда была похожа на команду Джо:

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, например, 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

Вам нужно экранировать '*', чтобы он работал, вы, вероятно, захотите избежать '.' для более точного совпадения точка будет соответствовать любому символу, а звездочка - совпадению между любым количеством символов.

Это будет соответствовать вам:

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