Aquí podría ser tu PUBLICIDAD


¿Cuál es la mejor manera de manipular cadenas en un script de shell?

votos
3

Tengo una ruta como una cadena en un script de shell, podría ser absoluta o relativa:

/usr/userName/config.cfg

o

../config.cfg

Deseo extraer el nombre del archivo (parte después del último /, entonces en este caso: config.cfg)

Me imagino que la mejor manera de hacer esto es con algunas expresiones regulares simples? ¿Es esto correcto? ¿Debo o debería usar sed o awk en su lugar?

Las características de manipulación de cadenas de Shell-scripting parecen bastante primitivas por sí mismas, y parecen muy esotéricas.

Cualquier solución de ejemplo también es apreciada.

Publicado el 12/03/2009 a las 15:52
fuente por usuario Alex
En otros idiomas...        العربية       

4 respuestas

votos
11

Si estás de acuerdo con usar bash, puedes usar expansiones de cadena bash:

FILE="/path/to/file.example"
FILE_BASENAME="${FILE##*/}"

Es un poco críptico, pero las llaves comienzan la expansión variable, y el doble hash hace una eliminación codiciosa del patrón glob especificado desde el comienzo de la cadena.

El doble %% hace lo mismo desde el final de una cadena, y un solo porcentaje o hash realiza una eliminación no codiciosa.

Además, también está disponible una construcción de reemplazo simple:

FILE=${FILE// /_}

reemplazaría todos los espacios con guiones bajos, por ejemplo.

Una barra única de nuevo, no es codicioso.

Respondida el 12/03/2009 a las 04:06
fuente por usuario guns


Aquí podría ser tu PUBLICIDAD


votos
6

En lugar de manipulación de cadenas, solo usaría

file=`basename "$filename"`

Editar :

Gracias a desenrollar una sintaxis más nueva para esto (que asume que su nombre de archivo se mantiene en $ nombre de archivo):

file=$(basename $filename)
Respondida el 12/03/2009 a las 03:55
fuente por usuario RobS

votos
1

Normalmente uso sed con una expresión regular simple, como esta:

echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'

resultado:

>echo "/usr/userName/config.cfg" | sed -e 's+^.*/++'
config.cfg
Respondida el 12/03/2009 a las 04:27
fuente por usuario Don Branson

votos
1

La mayoría de los entornos tienen acceso perly estoy más cómodo con eso para la mayoría de las manipulaciones de cadenas.

Pero como se mencionó, de algo tan simple, puedes usarlo basename.

Respondida el 12/03/2009 a las 03:58
fuente por usuario Ben S