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 dos
comando 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\1
substitui 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}\K
do início da linha, encontre2
a sequência de não-=
texto seguida por=
. O\K
meio 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