¿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
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 16:06
fuente por usuario

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 15:55
fuente por usuario

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 16:27
fuente por usuario

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 15:58
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more