Supongamos que todo el fichero de películas es como dices: dos líneas en la cual la primera es el nombre de la película y su año y en la siguiente todo lo demás.
Es decir, los registros de cada película empiezan en línea impar y terminan en una línea par.
El problema que tienes es que de esta manera, organizado por varias líneas, el grep de la línea 27 no funciona mas que como tu dices: sólo saca las líneas que coinciden con el patrón buscado, pero no todo el registro.
Se solucionaría de un plumazo si toda la base de datos contuviera los registros, uno por línea.
Supongamos que no, que queremos que sigan siendo cada dos líneas. Es evidente entonces que hay que cambiar la función find_lines para que nos busque, además de las líneas que coinciden con lo buscado, aquellas líneas que son sus 'compañeras'.
Esta es la nueva versión de find_lines:
Código:
22 find_lines()
23 {
24 # Busca lineas de entrada $1
25 res=-1
26 if [ ! -z "$1" ]; then
27 perl -ne '
28 BEGIN { $busca = shift; }
29 if ( /$busca/ ) {
30 unless ( $. % 2 ) { # Si es par
31 print $linea_anterior;
32 print $_;
33 }
34 else { # Si es impar
35 print $_;
36 $siguiente = <>;
37 print $siguiente;
38 }
39 }
40 $linea_anterior = $_;
41 ' "$@" $film
42 #grep -i "$@" $film
43 res=$?
44 fi
45 return $res
46 }
De la línea 27 a 41 ponemos un script en Perl

y comentamos el grep en la línea 42, ya que no nos hace falta.
El funcionamiento del script es el siguiente:
27: Ejecutamos Perl con la opción -n (recorrer todo el fichero $film) y la -e (ejecutar el script puesto a continuación)
28: BEGIN se ejecutará sólo una vez, al principio. Lo que hace es leer el primer parámetro que le pasamos al script (línea 41) que es "$@", el argumento de búsqueda
29: Esta línea y las siguientes se ejecutan una vez por cada línea del fichero $film. Aquí comprobamos si la línea leída coincide con el patrón de búsqueda. Vamos, que funciona exáctamente igual que el grep anterior
30: Hemos encontrado una coincidencia. Vemos ahora si el número de línea actual ($.) es par o no. Hacemos el truco de sacar el módulo (%) de 2 y si el resultado es 0, entonces es par. Sino, es impar.
31: La línea con la coincidencia es par, luego estamos en la segunda parte de un registro. Necesitamos pintar primera la $linea_anterior, y luego la línea actual.
34: Si es impar...
35: estamos en la primera línea de un registro. Pintamos esa línea...
36: leemos una línea más del fichero...
37: y la pintamos.
40: Guardamos la línea procesada como $linea_anterior para el siguiente bucle, por si nos hace falta en la línea 31.
43: res se actualiza con el resultado de la ejecución del perl, exáctamente igual que si fuera el grep.
¡Y ya está!
Perl es multiusos