Sed para excluir entre delimitadores, mas manter o primeiro delimitador

Sed para excluir entre delimitadores, mas manter o primeiro delimitador

Preciso deletar tudo entre o segundo =em uma string e o primeiro /em uma string, mas manter =no lugar. Eu tentei muitas, muitas coisas, a mais recente das quais é

sed -i 's/=[^/]*//

Responder1

Com base apenas na descrição do texto, sem entrada/saída de amostra, descobri o seguinte:

$ echo "foo=bar=baz/quux" | sed 's/\(.*=.*\)=.*\/\(.*\)/\1=\2/'
foo=bar=quux

Quão perto isso chega do que você deseja?

Responder2

Comecei a escrever sobre afirmações antecipadas e posteriores apenas para descobrir que sed não as suporta! Isso deve funcionar:

sed -i 's!\(=[^=]*=\)[^/]*/!\1!'

  • Como usamos /caractere no regexp, alteramos o delimitador do scomando para!
  • \(=[^=]*=\)é um grupo de captura que corresponde a um =caractere seguido por zero ou mais outros caracteres seguidos por outro =caractere. Esta parte é necessária para garantir que haja dois =caracteres antes da substring a ser excluída, como você disse que precisava
  • [^/]*/corresponde ao que quer que esteja entre os delimitadores e o segundo delimitador
  • \1substitui toda a string correspondente por qualquer que corresponda ao grupo de captura\(=[^=]*=\)

Responder3

Aqui está uma solução comperl

$ echo 'foo=bar=baz/quux' | perl -pe 's|^([^=]+=){2}\K[^=/]+/||'
foo=bar=quux

$ echo 'abc=foo=bar=baz/quux' | perl -pe 's|^([^=]+=){2}\K[^=/]+/||'
abc=foo=bar=baz/quux

Como pode ser visto nos exemplos acima, isso se restringe à exclusão de texto apenas do 2º =ao/

  • ^([^=]+=){2}\Kdo início da linha, encontre 2a sequência de não- =texto seguida por =. O \Kmeio lookbehind positivo, não faz parte da string de substituição
  • [^=/]+/significa um ou mais não- =/caracteres terminando com/
    • Se tal texto for encontrado, ele será excluído

Mesma solução comsed

$ echo 'foo=bar=baz/quux' | sed -E 's|^(([^=]+=){2})[^=/]+/|\1|'
foo=bar=quux

$ echo 'abc=foo=bar=baz/quux' | sed -E 's|^(([^=]+=){2})[^=/]+/|\1|'
abc=foo=bar=baz/quux

Ele não oferece suporte a construções lookahead/lookbehind, portanto, capture o grupo usado e referenciado retroativamente ao substituir

informação relacionada