2011-03-19 9 views

Respuesta

27

En bash se puede hacer lo siguiente:

nameis=${dataset%.*} 

... ej:

$ dataset=foo.txt 
$ nameis=${dataset%.*} 
$ echo $nameis 
foo 

Esta sintaxis se describe en la página del manual de bash como:

$ {param eter% palabra}

$ {parámetro %% palabra}

Quitar el modelo a juego sufijo. La palabra se expande para producir un patrón al igual que en la expansión del nombre de ruta. Si el patrón coincide con una porción posterior del valor expandido del parámetro, el resultado de la expansión es el valor expandido del parámetro con el patrón de coincidencia más corto (el caso "%") o el patrón más largo que coincide (el caso "%%") eliminado Si el parámetro es @ o *, la operación de eliminación de patrón se aplica sucesivamente a cada parámetro posicional, y la expansión es la lista resultante. Si el parámetro es una variable de matriz suscrita con @ o *, la operación de eliminación de patrón se aplica sucesivamente a cada miembro de la matriz, y la expansión es la lista resultante.

1

Algo así como ${dataset%.*} might work; tenga cuidado con los archivos sin extensiones, ya que buscará un punto que no forma parte de una extensión para cortar.

1

Se podría eliminar todo lo que sigue al último punto, en su caso, con sed:

nameis=$(echo $filename | sed 's/\.[^.]*$//') 

Pero eso no quiere trabajar en archivos con extensiones dobles como .tar.gz.

0

Yo sugeriría lugar de basename comando use sed para que, de esta manera:

echo "$fileName" | sed 's/\..*$//g'

+0

que pueden fallar para una archivo llamado, por ejemplo, 'foo.bar.baz' si desea que el resultado sea' foo.bar'. –

+0

Esto fue bastante bueno para mí, ya que quería que el nombre del archivo sea 'foo' desafortunadamente cuando el directorio también tiene un punto y falla. –

1

nameis = $ {.} * %% conjunto de datos Asume ninguno de sus nombres base tiene un punto en ella. Esto devuelve la cadena sin puntos más larga posible desde la izquierda.

5

Ahora, si quieres un poco elegante expresión regular de la vieja escuela:

echo "foo.bar.tar.gz" | sed "s/^\(.*\)\..*$/\1/" 

-> se convertirán: foo.bar.tar

 
I will break it down: 
s/ Substitute 
^  From the beginning 
\( Mark 
.*  Everything (greedy way) 
\)  Stop Marking (the string marked goes to buffer 1) 
\.  until a "." (which will be the last dot, because of the greedy selection) 
.*  select everything (this is the extension that will be discarded) 
$  until the end 
/ With (substitute) 
\1  The buffer 1 marked above (which is the filename before the last dot(.) 
/ End 

Cristiano Savino

+0

¡Gracias por la explicación! –

Cuestiones relacionadas