Estoy tratando de hacer un pequeño script bash que limpiará los nombres de archivos y carpetas de episodios descargados de algunos programas de televisión que me gustan. A menudo se ven como "[www.Speed.Cd] - Some.Show.S07E14.720p.HDTV.X264-ALGUIEN", y básicamente solo quiero quitar ese bit de publicidad speedcd.coincidencia de expresiones regulares de BASH, incluidos los corchetes en una lista de caracteres entre corchetes para hacer coincidir?
Es bastante fácil eliminar www.Speed.Cd, espacios y guiones usando correspondencias de expresiones regulares en BASH, pero por mi vida, no puedo encontrar la manera de incluir los corchetes en una lista de caracteres con los que comparar . [- [] no funciona, tampoco lo hace [- \ [], [- \\ [], [- \\\ [] o cualquier cantidad de caracteres de escape que preceden al corchete que deseo eliminar.
Esto es lo que tengo hasta ahora:
[[ "$newfile" =~ ^(.*)([- \[]*(www\.torrenting\.com|spastikustv|www\.speed\.cd|moviesp2p\.com)[- \]]*)(.*)$ ]] &&
newfile="${BASH_REMATCH[1]}${BASH_REMATCH[4]}"
pero se degrada en los soportes.
¿Alguna idea?
TIA, Daniel :)
EDIT: Probablemente debería notar que estoy usando "shopt -s nocasematch" para garantizar la coincidencia insensible caso, sólo en caso de que se esté preguntando :)
EDIT 2: Gracias a todos los que contribuyeron. No estoy 100% seguro de cuál respuesta fue la "correcta", ya que tuve varios problemas con mi afirmación. En realidad, la respuesta más precisa fue solo un comentario a mi pregunta publicada por jw013, pero no lo entendí en ese momento porque aún no había entendido que se debían escapar los espacios. He optado por aefxx, ya que básicamente dice lo mismo, pero con explicaciones :) Me hubiera gustado poner una respuesta correcta en la respuesta de ormaj, también, ya que vio problemas más graves con mi expresión.
De todos modos, el enfoque que estaba usando arriba, tratando de unir y extraer las partes para mantener y dejar atrás las no deseadas realmente no es muy elegante, y no detectará todos los casos, ni siquiera algo realmente simple como "Algunos .Show.S07E14.720p.HDTV.X264-ALGUIEN - [www.Speed.Cd] ". en cambio me he reescrito para que coincida y extraer sólo las partes no deseadas y luego hacer sustitución de cadenas de los de la cadena original, al igual que (bucle es en caso de que haya varios brandings):
# Remove common torrent site brandings, including surrounding spaces, brackets, etc.:
while [[ "$newfile" =~ ([[\ {\(-]*(www\.)?(torrentday\.com|torrenting\.com|spastikustv|speed\.cd|moviesp2p\.com|publichd\.org|publichd|scenetime\.com|kingdom-release)[]\ }\)-]*) ]]; do
newfile=${newfile//"${BASH_REMATCH[1]}"/}
done
en lugar de '[- \ []' 'tratar [- \ []' 'y en lugar de [- \]]' 'tratar [] - \]'. – jw013
Gracias, pero no rosquilla en cualquiera :( Alguna idea sobre esos? AFAICT, el primero que se escapa al espacio, y en cuanto a la segunda, la guía de BASH establece que cuando se utiliza un guión como un literal (en lugar de especificar una gama), tiene que venir como el primer carácter – DanielSmedegaardBuus