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).