Foros del Web » Administración de Sistemas » Unix / Linux »

Escoger solo una ocurrencia

Estas en el tema de Escoger solo una ocurrencia en el foro de Unix / Linux en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 29/06/2011, 15:22
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Escoger solo una ocurrencia

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
  1. #!/bin/bash
  2. set -x
  3. cp -v ${GROUP}/$INPUT_A_COPIAR || exit 1
  4. 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 original
  1. for programa in $programas
  2. do
  3. # Mi codigo
  4. 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.
  #2 (permalink)  
Antiguo 29/06/2011, 15:27
 
Fecha de Ingreso: junio-2010
Ubicación: Charlotte, NC
Mensajes: 611
Antigüedad: 13 años, 10 meses
Puntos: 95
Respuesta: Escoger solo una ocurrencia

Ya lo resolvi!!!
Era tan estúpida e idiota la respuesta...
por si alguien se le ofrece:

es el comando uniq


$ ls | sed -n '/.in$/p' | sed 's/\.[a-z]*.*/.setup.sh/g' | uniq

Genera

programa1.setup.sh
programa2.setup.sh
programa3.setup.sh
programa4.setup.sh

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:53.