2010-11-16 22 views
6

Estoy tratando de extender un comando sed sobre varias líneas en un archivo bash. Tengo varios patrones que requieren verificación y espero separar algunos de los patrones mediante un cambio de línea. Aquí está mi script actual que no funciona, poner todo en una línea funciona, pero esperaba simplemente limpiarlo un poco y dividir las cosas.Separar el comando 'sed' sobre múltiples líneas

#!/bin/sh -f 

#files=$(ls -1 | egrep '.avi|.mkv'); 

#echo $files 
for f in *.mkv *.avi; 
do 
    renF=`echo $f | tr '.' ' ' | sed -e 's/ \([^ ]*\)$/.\1/; s/\ \[sharethefiles\ com\]//i' \ 
    -e 's/\ x264\-Ctu//i; s/\ x264\-Bia//i; s/\ x264\-Fov//i' \ 
    -e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 
    -e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm' \ 
    -e 's/\ Dts\-Chd//i; s/\ WEB\-DL//i; s/\ H264\-SURFER//i' \ 
    -e 's/\ Dsr//; s/\ WS//i; s/\ PDTV//i; s/\ X264//i; s/\ Blu\-Ray//; s/\ Bdrip//i; s/\ Bluray//i; s/\ HDTV//i; s/\ DTS//i; s/\ AC3//i; s/\ Dd5//i; s/\ Dualaudio//i; s/\ AAC2//i; s/\ XVID//i'` 
    #echo $renF 
    if [ "$f" == "$renF" ]; then 
     echo "FileName already cleaned." 
    else 
     mv "$f" "$renF" 
    fi 
done 

¡Gracias por la ayuda!

+1

¿Qué significa "no funciona" significa? ¿Recibes un mensaje de error? ¿Qué es? ¿El resultado difiere de lo esperado? ¿En qué manera? No debería ser necesario escapar de los espacios y guiones de la manera que tiene. –

Respuesta

6

El problema está en esta línea:

-e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 

Falta s/. Debe ser:

-e 's/\ Xvid\-Lol//i; s/\ Xvid\-Xor//i; s/\ Xvid\-Notv//i; s/\ Xvid\-Fqm//i; s/\ Xvid\-p0w4//i; s/\ Xvid\-BIA//i; s/\ Xvid\-Chgrp//i; s/\ Xvid\-Fov//i' \ 

Incluí la barra diagonal inversa para mayor coherencia.

falta esta línea //i:

-e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm 

Corregido:

-e 's/\ PDTV\-Fov//i; s/\ PDTV\-River//i; s/\ PDTV\-Sfm//i 

Los mensajes de error que recibió fueron lo que me llevó a la fuente de los errores:

sed: -e expression #3, char 93: unknown command: `X' 

y

sed: -e expression #4, char 51: unterminated `s' command 

He aquí una sugerencia sobre cómo hacer esto más fácil de leer y fácil de mantener:

while read -r pattern 
do 
    sedscript+="$pattern;" 
done <<EOF 
s/ \([^ ]*\)$/.\1/ 
s/\ \[sharethefiles\ com\]//i 
s/\ x264\-Ctu//i 
s/\ x264\-Bia//i 
... 
s/\ XVID//i 
EOF 

renF=$(echo $f | tr '.' ' ' | sed -e "$sedscript") 
+0

Hmmmm, tal vez corregir esos errores estúpidos tal vez el problema. Tendré que verificarlo. – Ratty

+0

+1 - ¡la última pieza del código es una gran sugerencia! –

+0

Gracias por la ayuda, lo agradezco, eso es lo que estaba buscando. ¡Gracias! – Ratty

3

No estoy seguro si he entendido, pero se puede hacer algo como esto si lo que desea es tener varias líneas de expresiones de sed:

v=`echo 123|sed 's/1/2/ 
s/2/3/ 
s/3/4/'`; echo $v 

Esta muestra 423, como se esperaba.

Si desea que en una línea, eso es posible, también:

v=`echo 123|sed 's/1/2/ ; s/2/3/ ; s/3/4/'`; echo $v 

da el mismo resultado.

Por lo que veo, sugeriría hacerlo en múltiples líneas como ya lo está haciendo, simplemente poniendo cada -e en una línea separada, ya que creo que es más legible. Algo así como:

v=`echo 123|sed \ 
    -e 's/1/2/' \ 
    -e 's/2/3/' \ 
    -e 's/3/4/'` 
echo $v 

Comprobar este enlace para más información:

bajo Quoting multiple sed lines in the Bourne shell

+0

Bueno, esperaba incluir los mismos comandos en una línea como: sed -e 's/\ Xvid \ -Lol // i; s/\ Xvid \ -Xor // i; s/\ Xvid \ -Notv // i Y use el punto y coma para separar patrones similares en lugar de dividir cada uno individualmente. Tratando de emparejar los patrones si puedo. – Ratty

Cuestiones relacionadas