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]}