Cualquier idea que no sea puesta en un bucle?
En shells, no se puede evitar el bucle, ya que tradicionalmente no admiten la expresión regular, pero sí el emparejamiento global. Y los patrones glob no son compatibles con ningún tipo de contadores de repetición.
Y, por cierto, la forma más sencilla es hacerlo en shell es: echo $(cd $PWD/../.. && echo $PWD)
donde el /../..
hace que se desnivele dos niveles.
Con poco de Perl que sería:
perl -e '$ENV{PWD} =~ [email protected]^(.*)(/[^/]+){2}[email protected] && print $1,"\n"'
El {2}
en la expresión regular del Perl es el número de entradas de directorio para despojar. O lo que es configurable:
N=2
perl -e '$ENV{PWD} =~ [email protected]^(.*)(/[^/]+){'$N'}[email protected] && print $1,"\n"'
También se puede utilizar de split(), join() y splice() con el propósito, Perl, por ejemplo:
perl -e '@a=split("/", $ENV{PWD}); print join("/", splice(@a, 0, -2)),"\n"'
donde -2
dice que a partir de la trayectoria de las dos últimas entradas tiene que ser eliminado .
Gracias por su respuesta. No estoy familiarizado con Perl. Cualquier alternativa que use awk, sed sería muy apreciada. – Michael
@Michael - no, no se puede hacer eso en awk o sed - la lógica se encapsula en la biblioteca 'File :: Spec' de Perl y en la sintaxis del segmento de matriz (' @ dirs2 = @ dirs [0 .. $ # dir- 5] '). Sin embargo, no necesita ** saber ** perl para usar esta respuesta: simplemente copie/pegue la última línea en su script de shell tal como está (después de probarlo por supuesto) y cambie "5" a la profundidad deseada. – DVK