pt e remova a cadeia entre dois padrões

3

Eu tenho problema com a remoção de parte da string entre dois padrões com sed. Eu sempre tenho o último PATTERN-2 na fila:

test.txt:

PATTERN-1xxxxPATTERN-2aaa
PATTERN-1xxxxPATTERN-2fffPATTERN-1zzzzPATTERN-2gggPATTERN-1zzzzPATTERN-2
PATTERN-1xxxxPATTERN-2bbb

cmd

sed 's/PATTERN-1.*PATTERN-2//g' test.txt

o resultado acima é

aaa

bbb

mas gostaria de ter

aaa
fffggg
bbb

É possível encontrar o PATTERN-2 que está mais próximo do PATTERN-1?

    
por Maciej 11.01.2017 / 21:38

3 respostas

3

Como o @steeldriver aponta, é fácil se você tiver regexps não-gananciosos. Se não, você pode fazer isso com um loop, assim:

sed ':a;s/PATTERN-2/\n/;s/PATTERN-1.*\n//;ta' test.txt

Isso funciona porque sabemos que não há novas linhas no meio de nenhuma linha. Funcionaria também com qualquer outro caracter que não ocorra em qualquer linha, por ex. § .

    
por 12.01.2017 / 16:30
1

Se você quiser usar apenas sed tentar como abaixo

sed 's/PATTERN-1[^P]*PATTERN-2//g' test.txt
    
por 12.01.2017 / 16:50
0

No seu exemplo, o arquivo. * corresponde ao material que você deseja manter.

Você pode capturar essas coisas e substituí-las usando:

sed 's/PATTERN-1\(.*\)PATTERN-2//g' test.txt

Tudo entre os colchetes é armazenado no primeiro buffer de captura e é substituído no valor desse buffer.

    
por 12.02.2018 / 17:40