Sed em Bash Padrão difícil

2

Eu tenho uma string complicada que preciso procurar e substituir

Eu preciso substituir:

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

com

#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

Eu tenho medo de não poder usar python ou qualquer outra linguagem de script (meu script bash tem atualmente mais de 100 linhas)

Até agora eu tenho um arquivo de teste que contém a string em questão e estou tentando usar este comando 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

Nenhum erro é lançado, mas nada é substituído. Preciso escapar de certos caracteres dentro da string?

Qualquer conselho ajudaria, obrigado!

ATUALIZAÇÃO: o comando que usei era semelhante ao de 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$\):#\n,${catalina.home}/lib/ext,${catalina.home}/lib/ext/*.jar:' /etc/tomcat6/catalina.properties
    
por Doug Molineux 16.05.2011 / 22:31

2 respostas

2

Você precisa escapar do '*' para que ele funcione, você provavelmente desejará escapar do '.' para uma correspondência mais precisa, o período corresponderá a qualquer caractere e o asterisco com correspondência entre qualquer número de caracteres.

Isso fará a correspondência de que você precisa:

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$\):#,${catalina.home}/lib/ext,${catalina.home}/lib/ext/*.jar:' workers.properties

Eu escapei de cada meta-caractere (. e *) adicionei âncoras (^ e $) e usei uma referência anterior com (e) para que a parte antiga do padrão pudesse ser resusada.

Este é um guia decente para sed: link

    
por 16.05.2011 / 23:15
2

Isso fará isso - criar um arquivo com os seguintes comandos sed em, e. 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
}

use-o assim

sed -i -f sed.script filetoedit

você pode querer fazer uma cópia do arquivo para que você possa chamá-lo assim

sed -i.bak -f sed.script filetoedit
    
por 16.05.2011 / 23:38

Tags