Como combinar um ou mais caracteres não-slash

0

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

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

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

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

Considerando que uma correspondência de um único caractere 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 à direita não funciona porque adiciona outro nível:

$ echo dir/subdir/subsubdir/ | sed 's|[^/]*|..|g'
../../../../..
    
por dougkramer 24.01.2015 / 09:28

1 resposta

1

Infelizmente, existem muitos sabores da sintaxe de regex, cada um com suas próprias pequenas variações (ou às vezes não tão leves). Supondo que você esteja usando o GNU sed, qualquer uma dessas opções funcionará:

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

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

    
por 24.01.2015 / 09:41

Tags