2010-04-21 8 views
7

¿Cómo puedo eliminar partes de una cadena hasta cierto carácter?Cómo eliminar la sección principal en bash

Ej.) Si tengo la cadena testFile.txt.1 y testFile.txt.12345, ¿cómo puedo eliminar 1 y 12345?

EDITAR: Quise quitar y tirar la primera parte de una cadena hasta cierto personaje y mantener el final.

+0

La pregunta es un poco confusa - ¿podría aclarar por favor "eliminar partes de una cadena hasta cierto personaje?"; El ejemplo se puede interpretar de muchas maneras y, para ser sincero, la mayoría de ellos son para "eliminar después de cierto personaje" y no "hasta". – DVK

Respuesta

11

utilizando sólo las instalaciones de bash

$ s=testFile.txt.1 
$ echo ${s%.*} 
testFile.txt 

$ s=testFile.txt.12345 
$ echo ${s%.*} 
testFile.txt 

para eliminar antes de ceros a la izquierda

$ echo ${s#*.} 
txt.12345 

Otro método, es posible dividir la cuerda hacia arriba usando IFS

$ s=testFile.txt.12345 
$ IFS="." 
$ set -- $s 
$ echo $1 
testFile 
$ echo $2 
txt 
$ echo $3 
12345 
1

Si lo que desea es eliminar un sufijo conocido a partir de un nombre de archivo, puede utilizar basename:

basename testFile.txt.1 .1 
basename testFile.txt.12345 .12345 
+0

¿Existe una forma elegante de eliminar también ese período adelantado en la misma línea? Puedo hacerlo en dos, tenía curiosidad ... ¡Muchas gracias por su ayuda! –

+0

No estoy seguro de qué período de referencia está hablando –

1

Se podría usar sed para hacer una búsqueda y reemplazo. El operador <<< pasará una cadena en stdin.

$ sed 's/\.[0-9]*$//' <<< "testFile.txt.1" 
testFile.txt 
$ sed 's/\.[0-9]*$//' <<< "testFile.txt.12345" 
testFile.txt 
+0

tenga en cuenta que si está procesando una gran cantidad de archivos, esto llevará mucho más tiempo que las soluciones de "pure bash" si lanza un nuevo proceso ('sed') para cada uno. – drevicko

0

La pregunta no está claro, el ejemplo e proporcionado puede significar que desea eliminar todos los #s, o eliminar la parte después del último ".", o eliminar la parte después del primer "1", o incluso eliminar todos los charcters después del carácter 13. Aclarar.

Si quiere decir que quiere eliminar los primeros N caracteres de una cadena (por ejemplo, "hasta un carácter n. ° 13"), haga echo testFile.txt.1 | cut -c14-. Para retener los caracteres 1-13, por otro lado, haga echo testFile.txt.1 | cut -c1-13

Si quiere decir que desea eliminar los caracteres iniciales hasta la primera aparición de un carácter específico (en su ejemplo que parece ser "1") , haz echo testFile.txt.1 | perl -e 's/^[^1]*//;'. Para eliminar todo lo que después del primer "1", hacer echo testFile.txt.1 | perl -e 's/1.*$//;'

Si desea eliminar todos los #s, hacer echo testFile.txt.1 | perl -e 's/\d//g;' o sin Perl, echo testFile.txt.1 | tr -d "[0-9]"

Si desea eliminar todo después de la última "", do echo testFile.txt.1 | perl -e 's/\.[^.]+/./;'

+0

¿Por qué votar abajo? – DVK

0
# remove string prefix up to the first digit 
var='testFile.txt.12345' 
var='test1File.txt.12345' 
var='testFile.txt.1' 
var='testFile.txt' 

echo "${var#"${var%%[[:digit:]]*}"}" 
Cuestiones relacionadas