Se quisesse fazer com sed , você faria:
file=/any/path
sed '$s|/$||' << EOF
$file
EOF
Ou seja, remova um caractere / no final (segundo $ ) da última linha (primeiro $ ) do caminho armazenado em $file . Com algumas implementações de sed que assumem o tamanho em bytes da maior sequência de caracteres não pertencentes à nova linha em $file , não excede LINE_MAX (que geralmente é menor que o tamanho máximo de um caminho suportado em argumentos para chamadas do sistema ).
Observe que, para o caso especial de / ou // , a remoção desse / pode não ser desejável. Você também pode querer remover todos os / em /foo/bar/// , por exemplo.
Então talvez um mais avançado e que justifique sed um pouco mais seria:
sed '
${
s|\([^/]\)/*$||
s|^////*|/|
1b
s|/*$||
}' << EOF
$file
EOF
Isso é preservar // como é, transformar /// , ///// e / em / , mas foo// em foo e $'foo\n//' em $'foo\n' .
Observe que (?:...) é um operador perl regexp, não um operador regexp estendido (conforme reconhecido pelo GNU sed com essa opção -r específica do GNU).