¿Cómo puedo escribir un script de shell para recuperar texto que se encuentra entre dos cadenas?

Aquí hay un enfoque:
1. Separe el texto entre las dos palabras clave de las palabras clave mismas.
2. Obtenga las líneas que está buscando.

Aquí hay un ejemplo de cómo funcionaría en la siguiente entrada:

“Me gusta el script de shell porque es divertido”

1)

  bash ~ $ echo "Me gusta el script de shell porque es divertido"> archivo
 bash ~ $ sed 's: \ (como \ | porque \): \ n & \ n: g' archivo> out_1
 yo 
 me gusta
  script de shell 
 porque
  es divertido 

Usé ‘:’ en el comando sed como separador. ‘s’ significa sustituto y lo que hace es sustituir “me gusta” o “porque” con “\ n & \ n”. ‘&’ es básicamente lo que encontró. “me gusta” se reemplaza por “\ nlike \ n” y “porque” se reemplaza por “\ nporque \ n”.

2)

  bash ~ $ awk '/ porque / {encontrado = 0; resultado printf;  result = ""} found == 1 {result = result $ 0 "\ n"}; / like / {found = 1} '<out_1
  script de shell 

Awk tiene el separador ‘;’ y se comporta así: awk ‘/ search1 / action1; / search2 / action2’.

En este caso, cuando se encuentra la palabra clave “me gusta”, se establece en 1, lo que significa que el texto a partir de ahora debe guardarse porque se encuentra después de un “me gusta”. Lo hace concatenando para obtener el valor de $ 0 y luego configurando el valor encontrado de nuevo a 0, lo que significa que la región entre “me gusta” y “porque” ha finalizado. La concatenación al resultado solo se realiza si encontrado se establece en 1, lo que impide escribir cualquier cosa si “porque” si se encuentra sin un “me gusta” detrás. Espero que esto tenga sentido.

Su texto puede contener caracteres de nueva línea, por lo que tiene que haber una manera de diferenciar la salida en caso de que haya dos ocurrencias del patrón que está buscando. En ‘awk’, donde el resultado se inicializa en la cadena vacía, puede reemplazarlo con un separador que desee.

Aquí hay una variante de script de shell:

  #! / bin / bash

 si [$ 1] && [$ 2] && [$ 3]
 luego

 sed 's: \ (' $ {1} '\ |' $ {2} '\): \ n & \ n: g' $ 3 |  awk '/' $ {2} '/ {encontrado = 0; resultado printf; resultado = ""} encontrado == 1 {resultado = resultado $ 0 "\ n"}; /' $ {1} '/ {encontrado = 1 } '

 más
 echo "Parámetros no presentes"
 fi

Es necesario realizar algunos escapes para diferenciar entre los parámetros del script de shell y la entrada real a los comandos.

Los parámetros $ 1 y $ 2 serán las dos palabras clave y $ 3 el archivo de entrada. Es una buena idea asegurarse de que los parámetros no sean nulos antes de ejecutar el comando.

El script de shell combina los dos comandos en uno usando la tubería ‘|’ operador.

Un problema con este enfoque es que todo se mantiene entre las dos palabras clave, incluido el espacio en blanco. El resultado de este comando, por supuesto, se puede utilizar como entrada para un script diferente que elimina los espacios en blanco iniciales y finales.