Você pode usar o fato de que .*
é ganancioso:
sed 's/\(.*\)|/'/'
Ou use:
sed 's/|\([^|]*\)$/'/'
Para corresponder a |
seguido por algo que não contenha |
até o fim da linha, como já mostrado por Toby, mas essa abordagem só funciona para substituições de caracteres únicos.
Para substituí-lo em uma variável de shell de sequência multilinha, com GNU sed
, você pode usar a opção -z
, 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âmetro padrão:
case $var in
(*'|'*) var=${var%'|'*}'''${var##*'|'}
esac
Ou com esses comandos sed
traduzidos para o equivalente em shell:
Em ksh93
:
var=${var/@(*)'|'/'''}
var=${var/%'|'*([^'|'])/'''}
Em bash
(assumindo que a string não contém sequências de bytes que não formam caracteres válidos no local atual):
re='(.*)\|(.*)'
[[ $var =~ $re ]] && var=${BASH_REMATCH[1]}'''${BASH_REMATCH[2]}
Em zsh
:
set -o extendedglob
var=${var/(#b)(*)'|'/$match[1]'''}
var=${var/%(#b)'|'([^'|']#)/'''$match[1]}