Como combinar um ou mais caracteres sem barra

Como combinar um ou mais caracteres sem barra

Recebi um caminho relativo que desce n níveis de profundidade e quero produzir o caminho "reverso" que sobe o mesmo número de níveis. Quero produzir o mesmo número de níveis com ou sem espaço à direita. Por exemplo:

dir/subdir/subsubdir  should produce ../../..
dir/subdir/subsubdir/ should produce ../../../

Por que um operador positivo não consegue encontrar uma correspondência? Isso não significa um ou mais caracteres sem barra?

$ echo dir/subdir/subsubdir | sed 's|[^/]+|..|g'
dir/subdir/subsubdir

enquanto uma correspondência de caractere único seguida por uma correspondência de estrela funciona:

$ echo dir/subdir/subsubdir | sed 's|[^/][^/]*|..|g'
../../..

mesmo com uma barra final:

$ echo dir/subdir/subsubdir/ | sed 's|[^/][^/]*|..|g'
../../../

FWIW, uma estrela (*) funcionará no lugar do sinal de mais (+):

$ echo dir/subdir/subsubdir | sed 's|[^/]*|..|g'
../../..

mas uma barra final não serve porque adiciona outro nível:

$ echo dir/subdir/subsubdir/ | sed 's|[^/]*|..|g'
../../../../..

Responder1

Infelizmente, existem muitos tipos de sintaxe regex por aí, cada um com suas pequenas (ou às vezes não tão leves) variações. Supondo que você esteja usando GNU sed, qualquer uma destas opções funcionaria:

$ echo dir/subdir/subsubdir | sed 's|[^/]\+|..|g'
../../..
$ echo dir/subdir/subsubdir | sed -r 's|[^/]+|..|g'
../../..

Em geral, você desejará verificar a página de manual de qualquer ferramenta que estiver usando para ver qual tipo ela usa.

informação relacionada