2012-03-07 10 views
6

Soy muy nuevo en bash. Entonces, si esta es una pregunta bastante básica, por favor perdónenme.Cómo hacer coincidir el patrón al final de la línea/texto

Estoy tratando de reemplazar la extensión de archivo '.gzip' con '.gz'.

ej .:

testfile.xml.gzip => testfile.xml.gz 

Alguien ha escrito un script que hace esto:

GZIP=`echo ${FILE} | grep .gz` 

    . 
    . 
    . 

FILE=`echo ${FILE} | sed 's/.gz//g'` 

La primera línea coincide erróneamente testfile.xml.gzip archivo. El grep .gz coincide con el texto en nombre de archivo que está en el medio, mientras que necesito que coincida solo si está al final del nombre de archivo. ¿Alguien puede ayudarme con cómo corregir este problema? En resumen, necesito saber la expresión que coincide con el patrón al final de la línea/texto.

+0

Aprender ane :-) de ERE de POSIX BRE Cuidado con '\ r \ n 'saltos de línea de Windows. –

Respuesta

13

Uso $ para que coincida con el final de la línea:

FILE=`echo ${FILE} | sed 's/.gz$//g'` 

De todos modos, lo que hace este comando es quitar el .gz extensión del nombre del archivo de salida, que no es lo que usted está buscando de acuerdo a su pregunta. Para hacer eso, la respuesta de dnsmkl es el camino a seguir con sed.

Tenga en cuenta que puesto que ya tiene FILE en una variable de entorno puede utilizar fiesta string manipulation de la siguiente manera:

$ FILE=textfile.xml.gzip 
$ echo ${FILE/%gzip/zip} 
textfile.xml.zip 
+2

Su patrón de coincidencia, aunque probablemente sea bastante suficiente, no es 100% correcto, ya que también convertirá los nombres de archivo como 'foobargz' en' fooba', necesita agregar '\' antes de '.' si lo quiere literalmente coincide con el _dot_, de lo contrario cualquier punto en el patrón coincidirá con cualquier carácter. Alternativamente, si no te importan los puntos, quizás sería mejor dejarlos fuera del patrón, porque, tal como están, es confuso. – Timo

6

final de la cadena se corresponde con "$" en la sed

Por ejemplo

echo 'gzip.gzip' | sed 's|gzip$|gz|g' 

La salida es

gzip.gz 
0

debería hacer un directorio while de archivos .gzip

(ls * .gzip | mientras lee la línea; do mv "$ line" "$ (nombre base" $ línea ".gzip) .gz"; Listo)

0

This pueden funcionar para usted:

rename gzip gz *gzip 
Cuestiones relacionadas