2013-11-08 3 views
0

у меня есть:BASH эхо с СЭД

Location.txt (содержание)

some_line1 
some_line2 
some_line3 

region.txt (содержание)

region1 
region2 
region3 

uri.txt (содержание)

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

Мне нужно создать файлы

region1 
region2 
region3 

и каждый из них должен заполнить следующую (название региона вместо звезд)

Пример файла 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 

Пример из файла регионе2 (название региона вместо звезд)

/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 

Теперь у меня есть

#!/bin/bash 

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

Этот скрипт создает файлы с именами строк от region.txt и заполняет его строками от uri.txt.

Но мне нужно сделать много файлов. Каждый файл должен быть заполнен множеством мест, но одна строка в каждом месте должна быть изменена в строке от uri.txt.

Похоже, я должен использовать

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

, но я не знаю, как его использовать.

Любая помощь пожалуйста.

+1

Где находится 'location.txt'?Вы указали его в начале описания и упомянули его в следующем абзаце, но вы не ссылаетесь на него нигде, так что неясно, какой контент вы ищете во всех областях '/ home/user/regions/$ region 'файлы. – lurker

+0

, возможно, добавьте небольшой образец некоторых файлов, которые будут использоваться, и ожидаемый результат в одном из них. – NeronLeVelu

+0

Извините. Я отредактировал мой пост –

ответ

1

Если я правильно понимаю, ваша проблема, чем 3, вложенные в цикл, могут выполнять эту работу.

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 

Результат:

$ 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 

Я надеюсь, что это поможет!

+0

echo "$ uri" | sed -e "s/\ * \ * \ */$ reg/g" | tee -a $ reg.txt был действительно полезен. Спасибо. –

+0

Плохая и страшная практика замечена: 'for' loop on' cat'. Позор вам для распространения плохих практик! '-1'. –

+0

Критик принимается, если вы предоставите мне какое-то объяснение. –

2

Я хотел бы использовать AWK для этого:

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 
+0

Спасибо. Но это слишком тяжело для меня :) –

0

Finaly Я использовал следующее, и она работает.

#!/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 

Благодарим всех вас за помощь.

+1

Ваша вещь сломается, если в именах файлов есть пробелы. Используйте больше цитат! На самом деле в вашем скрипте много неправильного материала ... слишком много для меня, чтобы объяснить их здесь в комментарии. –

+0

Спасибо за ваш комментарий. Я начинаю в скриптах. Но я буду расти :) Имена файлов сделаны мной, поэтому не может быть пробелов. Не могли бы вы объяснить, почему я должен использовать больше кавычек? –

+1

Просто, как привычка, всегда используйте кавычки, даже если вы уверены, что имена файлов не содержат пробелов. Это лучшая привычка, которую вы можете взять: вы тогда запрограммируете, не задумываясь! –

2

@ user2874004: сценарий, немного лучше написано:

#!/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 

(я понятия не имею, что он делает, хотя :)).

+0

Это genereate тысячи включают файлы для тысяч мест с десятками правил. –

+0

Кто знает Если это нормально для конфигурации NGINX? –

Смежные вопросы