Problema com a subestixação de sed em regex de várias palavras

1

Veja este exemplo simples:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*><Haystack\|Foo\)>\(.*\)/ ts=\"\">/'

retornará:

<?xml version=1.0?><Haystack ts="20150310 21:12:01.846338"><Event

Essencialmente eu quero pegar os primeiros 24 caracteres da linha, inseri-los como um atributo xml do elemento raiz e substituir o resto do xml. Isso funciona.

Mas se eu transpor o Haystack\|Foo para Foo\|Haystack ele simplesmente retorna a string original, não encontrando correspondência. Eu realmente tenho cerca de 7 elementos-raiz para procurar.

Mas o \| deve ser como você insere várias palavras para correspondência, como em:

echo "foo" | sed 's/foo\|bar/nobar/'

Então, como faço para que a correspondência de referência () funcione da mesma maneira acima?

Estou usando o Fedora Linux, versão 4.2.2.

Além disso, se alguém puder sugerir um regex mais eficiente, eu ficaria muito grato. Isso faz parte de um problema muito maior definido com cerca de 7 expressões XML raiz que estou procurando e que precisam ser executadas o mais rápido possível.

    
por bfoddy 14.03.2015 / 03:54

1 resposta

3

Sua expressão informa a sed para corresponder a <?xml.*><Haystack ou Foo . O mecanismo Regex usa o parêntese de captura para informar até onde a esquerda ou a direita estende o operador or . (Se você usasse um motor PCRE, você poderia usar parênteses sem captura).

Código problemático original:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*><Haystack\|Foo\)>\(.*\)/ ts=\"\">/'

Código fixo:

echo "20150310 21:12:01.846338::: <?xml version="1.0"?><Haystack><Event " \
| sed 's/^\(.\{24\}\)::: \(<?xml.*>\)<\(Haystack\|Foo\)>\(.*\)/< ts=\"\">/'
    
por 14.03.2015 / 04:31