Asignando solo parte de una cadena a una variable en bash

11

Recibo del usuario una determinada ruta de archivo absoluta, y quiero crear una variable que será una cadena que no incluirá solo los PRIMEROS dos componentes de la ruta del archivo, pero sin imprimirla ni nada.

Por ejemplo, la ruta absoluta podría ser:

/home/myusername/folder1/folder2/folder3

Y se guarda en "target_path", y quiero que "mydir" sea solo:

/folder1/folder2/folder3

Intenté usar el comando de corte de diferentes maneras pero sin éxito.

La vida de Pi
fuente
¿Es /home/usernameel $HOMEdirectorio real del usuario que invoca? Si es así usted podría quitar simplemente usando mydir="${target_path#$HOME}"Creo
steeldriver

Respuestas:

15

Usando la manipulación de cadenas de bash :

$ a=/home/myusername/folder1/folder2/folder3
$ echo "${a#/*/*/}"
folder1/folder2/folder3

Entonces, la cadena que desea sería (agregando la barra inclinada):

b="/${a#/*/*/}"

Para una variable a, ${a#foo}eliminará la coincidencia de cadena más corta foodesde el inicio de a. Por lo tanto, eliminamos la cadena más corta que contiene tres /(incluida la barra diagonal en la ruta), para eliminar los dos primeros componentes de la ruta absoluta.

muru
fuente
La ruta puede ser de 30 carpetas, y solo quiero incluir las últimas 28. ¿Esto todavía funcionará?
Vida de pi
@Lifeofpi ¿por qué no?
muru
9

Aquí hay un ejemplo usando cut

echo "/home/myusername/folder1/folder2/folder3" | cut -d '/' -f4- 

folder1/folder2/folder3

Si necesita la guía /, puede agregarla | sed 's/^/\//'al final de su línea.

Lo necesita -f4-porque -d '/'le dice cutque lo use /como delimitador entre campos. Entonces, el primer campo viene antes del primer delimitador, en este caso el primer campo está vacío. Así folder1es el 4to campo y -f4-le dice a cut que use todos los campos del 4to en adelante.

Guntbert
fuente
7

Puede usar la expansión de parámetros bash de esta manera:

target_path=/home/username/folder1/folder2/folder3
myvar="/${target_path#/*/*/}"

Después de este:

echo $myvar

da:

/folder1/folder2/folder3

Funciona al eliminar la primera coincidencia del patrón /*/*/de su variable target_path, mediante el uso de la ${target_path#pattern}sintaxis de expansión de parámetros de shell. Desafortunadamente, esto elimina el primer /carácter, razón por la cual ese carácter debe incluirse explícitamente al configurar la variable myvar.

Advertencia: debe verificar que su variable target_path contenga algunos caracteres y que sea más larga que dos segmentos de ruta antes de utilizar este método. Por ejemplo si target_path=/home/username/, entonces myvar=/. Esto podría ser peligroso para su sistema si está ejecutando algo así rm -rf "$myvar"*. ¡No intentes esto!

Arronico
fuente
La ruta puede ser de 30 carpetas, y solo quiero incluir las últimas 28. ¿Esto todavía funcionará?
Vida de pi
Definitivamente, esto solo recortará los dos primeros, sin importar la longitud de la ruta.
Arronico