Tengo:

Location.txt (contenido)

some_line1
some_line2
some_line3

region.txt (contenido)

region1
region2
region3

uri.txt (contenido)

/some_text/some_text1/***/
/some_text/***/some_text2/
/***/some_text/some_text3/

Necesito crear archivos

region1
region2
region3

y cada uno de ellos tiene que llenar con la siguiente (nombre de la región, en lugar de las estrellas)

Ejemplo de archivo de region1

/some_text/some_text1/region1/
some_line1
some_line2
some_line3

/some_text/region1/some_text2
some_line1
some_line2
some_line3

/region1/some_text/some_text3
some_line1
some_line2
some_line3

Ejemplo de archivo de region2 (nombre de la región, en lugar de las estrellas)

/some_text/some_text1/region2/
some_line1
some_line2
some_line3

/some_text/region2/some_text2
some_line1
some_line2
some_line3

/region2/some_text/some_text3
some_line1
some_line2
some_line3

Ahora tengo

#!/bin/bash

while read region
    do
        while read uri
        do
            echo $uri >> "/home/user/regions/$region"
        done < uri.txt
    done < region.txt

Este script crea archivos con los nombres de las líneas de region.txt y llenarlo con líneas de uri.txt.

Pero tengo que hacer un montón de archivos. Cada archivo debe estar lleno de muchos lugares, pero una línea en cada ubicación debe ser cambiado a la línea de uri.txt.

Parece que tengo que usar

cat $file|sed 's/^was/now/'

pero no sé cómo usarlo.

Cualquier ayuda por favor.

  • ¿De dónde location.txt entran en juego? Que figuran en el comienzo de su descripción, y mencionó en el siguiente párrafo, pero no es referencia en otro lugar, por lo que no está claro cuál es el contenido que está buscando en todos los /home/user/regions/$region archivos.
  • tal vez agregar una pequeña muestra de algunos de los archivos utilizados y el resultado esperado en uno de ellos.
  • Lo siento. He editado mi post
InformationsquelleAutor merlin.metso | 2013-11-08

4 Comentarios

  1. 1

    Si he entendido bien tu problema de 3 anidada para el ciclo puede hacer el trabajo.

    for reg in $(cat region.txt )
    do
      echo -n > $reg.txt
        for uri in $(cat uri.txt )
        do
          echo "$uri" | sed -e "s/\*\*\*/$reg/g" | tee -a $reg.txt
            for loc in $(cat Location.txt )
            do
              echo $loc | tee -a $reg.txt
            done
        done
    done

    Resultado:

    $ cat region1.txt 
    /some_text/some_text1/region1/
    some_line1
    some_line2
    some_line3
    /some_text/region1/some_text2/
    some_line1
    some_line2
    some_line3
    /region1/some_text/some_text3/
    some_line1
    some_line2
    some_line3

    Espero que esto ayude!

    • echo «$uri» | sed-e «s/***/$reg/g» | tee -a $reg.txt fue realmente útil. gracias.
    • Malo y terrible práctica manchado: for bucle en cat. Que vergüenza para la difusión de las malas prácticas! -1.
    • El crítico aceptada si me dan alguna explicación.
    • mywiki.wooledge.org/BashPitfalls
    • Bien, muchas gracias. Ahora entiendo … no se basan en un único espacio presentado separadores, porque no hay ninguna garantía de que no hay ningún espacio en la entrada…
  2. 2

    Me gustaría utilizar awk para esto:

    awk -v loc="$(< Location.txt)" '
        NR==FNR {region[$1]=1;next}
        {for (reg in region) {
            sub(/\*\*\*/, reg)
            f = reg ".txt"
            print > f
            print loc > f
        }}
    ' region.txt uri.txt
    • Gracias. Pero es demasiado pesada para mí 🙂
  3. 2

    @user2874004: su guión, un poco mejor escrito:

    #!/bin/bash
    
    mkdir -p configs # make directory for configs if it doesnt exist
    
    while IFS= read -r reg # read next line from reg.txt
    do
        while IFS= read -r uri # read next line from uri.txt
        do
            echo "    ${uri//\*\*\*/$reg} {" # make changes
            while IFS= read -r loc # read next line from location.txt
            do
                echo "        $loc" # fill in the location 
            done < location.txt
        done < uri.txt > "./config/$reg.txt"
    done < region.txt

    (No tengo idea de lo que hace, aunque :)).

    • Es genereate miles incluir archivos de miles de ubicaciones con docenas de reglas.
    • Quién sabe Si es normal que la configuración de NGINX?
  4. 0

    Finalmente, he utilizado el siguiente, y funciona.

    #!/bin/bash
    
    mkdir -p configs # make directory for configs if it doesnt exist
    
    while read reg # read next line from reg.txt
    do
      if [ -f ./configs/$reg.txt ]; then # if file allready exist then 
        rm ./configs/$reg.txt # delete it
      fi
        while read  uri # read next line from uri.txt
        do
            echo "    $uri {" | sed -e "s/\*\*\*/$reg/g"  >> ./configs/$reg$ # make changes
            while read loc # read next line from location.txt
            do
                    echo "        $loc" >> ./configs/$reg.txt # fill in the location 
            done < location.txt
        done < uri.txt
    done < region.txt

    Gracias a todos por su ayuda.

    • Lo tuyo va a romper si hay espacios en los nombres de archivo. El uso más citas! De hecho, hay un montón de cosas mal en el script… demasiados para mí explicar aquí en un comentario.
    • Gracias por tu comentario. Estoy principiantes en secuencias de comandos.Pero voy a crecer 🙂 los nombres de Archivo son hechas por mí, así que no podría haber espacios. Podría usted explicar por qué debo usar más citas?
    • Solo, como un hábito que siempre use comillas, incluso si usted está seguro de que los nombres de los archivos no contienen el espacio. Este es el mejor hábito que puedes tomar: a continuación, el programa de firmeza, sin siquiera pensar!

Dejar respuesta

Please enter your comment!
Please enter your name here