Cómo hacer coincidir uno o más caracteres sin barra

Cómo hacer coincidir uno o más caracteres sin barra

Me dan una ruta relativa que desciende n niveles de profundidad y quiero producir la ruta "inversa" que asciende la misma cantidad de niveles. Quiero producir la misma cantidad de niveles con o sin espacio final. Por ejemplo:

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

¿Por qué un operador plus no encuentra una coincidencia? ¿No significa esto uno o más caracteres sin barra?

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

mientras que una coincidencia de un solo carácter seguida de una coincidencia de estrellas funciona:

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

incluso con una barra diagonal:

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

FWIW, una estrella (*) funcionará en lugar del signo más (+):

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

pero entonces una barra diagonal no servirá porque agrega otro nivel:

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

Respuesta1

Desafortunadamente, existen muchos tipos de sintaxis de expresiones regulares, cada uno con sus propias variaciones leves (o, a veces, no tan leves). Suponiendo que esté utilizando GNU sed, cualquiera de estas opciones funcionaría:

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

En general, querrás consultar la página de manual de cualquier herramienta que estés usando para ver qué tipo utiliza.

información relacionada