Hola compañeros,
estoy escribiendo un shell script, que seguramente no es el mejor que he escrito en mi vida.. pero bueno, me duele mucho la cabeza y no veo la luz en este problema:
Tengo un arbol de directorios, en los cuales dentro de cada carpeta, se encuentran diversos archivos. Primordialmente, programas en un interprete que utilizan en mi trabajo.
Estos programas, tienen shell scripts auxiliares, y esos shell scripts auxiliares son utilizados para validar la correcta ejecución del programa.
Yo me encuentro desarrollando un shell script, que genera los shell scripts auxiliares, porque cada directorio contiene literalmente cientos de programas, entonces escribir shell scripts auxiliares para toda la carpeta es meramente... muy tardado.
Todos los scripts auxiliares siguen un patrón, es decir que es muy facil generar todos los shell scripts necesarios para la validación del programa, cada programa necesita 4 shell scripts como máximo, y ya tengo los programas que generan los primeros 3, pero el último me está dando dolores de cabeza.
Mi problema es el siguiente,
Algunos de estos programas leen información de archivos externos con terminación .in (INPUT), y el nombre del archivo IN, es tambien el nombre del programa que se interpreta.
Ejemplo:
programa.f lee datos del archivo
programa.in
Entonces el "stub" (machote, patrón, modelo de referencia), es un script como este:
Código bash:
Ver original#!/bin/bash
set -x
cp -v ${GROUP}/$INPUT_A_COPIAR || exit 1
exit 0
Lo que llevo hecho hasta el momento, es que encuentre todos los archivos con terminación .in, entonces el nombre de ese archivo, es automaticamente, también el nombre del programa, por lo tanto, solo los programas que correspondan a ese nombre, van a necesitar del shell script.
Ejemplo:
programa1.f
programa2.f
programa3.f
programa3.in
programa4.f
programa5.f
programa5.in
Mi script, sabe que solamente va a generar un shell script auxiliar, para programa3.f y programa5.f, porque son los únicos que leen archivos externos.
El problema ocurre, es que programa3.f y programa5.f , leen diversos archivos, por lo tanto los nombres de los archivos, pueden variar
programa3.uno.in
programa3.dos.in
programa3.tres.in
programa5.rojo.in
programa5.verde.in
programa5.azul.in
Entonces la solución "obvia" es utilizar expresiones regulares, para encontrar los patrones que concuerdan. Mi problema es que cuando utilizo las expresiones regulares, encuentra mas de una ocurrencia, y yo solo necesito la primera.
Es decir,
solo necesito que diga, sin importar que es lo que hay entre el primer . (punto) de izquierda a derecha, hasta la extension .in
programa3.in
programa5.in
Entonces, la expresión regular que estoy utilizando es la siguiente:
$ ls | sed -n '/.in$/p' | sed 's/\.[a-z]*.*/.setup.sh/g'
Y el output es:
programa1.setup.sh
programa2.setup.sh
programa2.setup.sh
programa3.setup.sh
programa3.setup.sh
programa3.setup.sh
programa4.setup.sh
programa4.setup.sh
programa4.setup.sh
programa4.setup.sh
programa4.setup.sh
programa4.setup.sh
Y solo quiero que me salga:
programa1.setup.sh
programa2.setup.sh
programa3.setup.sh
programa4.setup.sh
para poder hacer un
Código bash:
Ver originalfor programa in $programas
do
# Mi codigo
done
Ya no se como hacerle... será que ya me duele la cabeza, o ya tengo casi 8 horas programando diversas cosas muy revueltas, que ya no puedo pensar claramente. Cualquier ayuda se agradece.