У меня сложная строка, которую мне нужно найти и заменить
Мне нужно заменить:
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