Para corresponder |seguido por algo que não contém |até o final da linha, como já mostrado por Toby, mas essa abordagem funciona apenas para substituições de caracteres únicos.
Para substituí-lo em uma variável shell de string de várias linhas, com GNU sed, você pode usar a -zopção que trata a entrada como delimitada por NUL em vez de delimitada por nova linha:
var=$(printf %s "$var" | sed -z '...')
Outra abordagem seria fazer a substituição usando operadores de expansão de parâmetros padrão:
case $var in
(*'|'*) var=${var%'|'*}'`'${var##*'|'}
esac
Ou com esses sedcomandos traduzidos para o equivalente do shell:
Você pode usar o fato de que
.*
é ganancioso:Ou use:
Para corresponder
|
seguido por algo que não contém|
até o final da linha, como já mostrado por Toby, mas essa abordagem funciona apenas para substituições de caracteres únicos.Para substituí-lo em uma variável shell de string de várias linhas, com GNU
sed
, você pode usar a-z
opção que trata a entrada como delimitada por NUL em vez de delimitada por nova linha:Outra abordagem seria fazer a substituição usando operadores de expansão de parâmetros padrão:
Ou com esses
sed
comandos traduzidos para o equivalente do shell:Em
ksh93
:Em
bash
(assumindo que a string não contém sequências de bytes que não formam caracteres válidos na localidade atual):Em
zsh
:Você pode canalizar
rev
, substituir a primeira ocorrência e, em seguida,rev
novamente:Alternativamente, em pure
sed
, você deseja substituir|
seguido por qualquer coisa que não inclua|
seguido pela`
mesma sequência:Eu diria que o primeiro deles é mais fácil de ler e entender.
${str%\|*}
expande para a string com o último|
e tudo depois de removido.${str##*\|}
expande para a string com o último|
e tudo antes de ser removido.A combinação das duas substituições de parâmetro acima, com um
`
intermediário, fornece a string de resultado.Parte da resposta de @Stéphane Chazelas de uma forma mais "didática"...
Observe o uso de
-z
que permite que<YOUR_ESCAPED_TARGET>
e<YOUR_ESCAPED_REPLACE>
tenha várias linhas.NOTA: Uma resposta mais completa que explica como
<YOUR_ESCAPED_TARGET>
e<YOUR_ESCAPED_REPLACE>
pode ser escapada pode ser encontrada aqui .Obrigado! ?