Как я могу сделать цикл в оболочке - PullRequest
0 голосов
/ 18 октября 2018

У меня в файле есть следующее:

[Class:ABCD_EFGH_IJK]
list.0=VALUE001*
list.1=VALUE002*
list.2=VALUE003*
list.3=VALUE004*
[Class:ABCD_EFGH_IJK:app:ABCD_EFGH_IJK]
condition=true

[Class:LMNO_PQRS_TUV]
list.0=VALUE004*
list.1=VALUE005*
list.2=VALUE006*
list.3=VALUE007*
[Class:LMNO_PQRS_TUV:app:LMNO_PQRS_TUV]
condition=true

У меня есть другой скрипт, который запускается с использованием имени класса и списка в качестве аргументов.Например:

./myscript VALUE001* ABCD_EFGH_IJK

Мне нужно использовать цикл for, чтобы перебрать каждый класс и получить каждое значение для запуска моего скрипта.Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 18 октября 2018

Это то, что вы просили:

$ awk -F'[]:=[]' '/Class:/{class=$3} /^list/{print $2, class}' file |
    xargs -n2 echo ./myscript
./myscript VALUE001* ABCD_EFGH_IJK
./myscript VALUE002* ABCD_EFGH_IJK
./myscript VALUE003* ABCD_EFGH_IJK
./myscript VALUE004* ABCD_EFGH_IJK
./myscript VALUE004* LMNO_PQRS_TUV
./myscript VALUE005* LMNO_PQRS_TUV
./myscript VALUE006* LMNO_PQRS_TUV
./myscript VALUE007* LMNO_PQRS_TUV

Удалите echo, когда вы будете готовы фактически вызвать ./myscript.

0 голосов
/ 19 октября 2018

Ужасный (слишком сложный) пример использования пространства Hold в sed:

sed -nr '/\[Class:/ {s/\[Class:(.*)\]/\1/;h};/list/{G;s#.*=(.*)\n#./myscript \1 #p}' file

В словах:
Когда вы видите строку с Class:, скопируйте имя класса в Holdпространство.Когда вы видите строку с list, добавьте пробел Hold (имя класса) к текущей строке,
и используйте вставленный символ новой строки для изменения первой части.
Напечатайте строку.

# используется, когда строка замены имеет \.
Запомненные совпадающие строки в () вызываются с \1.

0 голосов
/ 18 октября 2018

Попробуйте:

Сначала я использовал awk и преобразовал файл конфигурации в следующий формат:

awk '/^\[/ { app=substr($0,2,length-2) } /=/ { print app "." $0 }' test.txt 
Class:ABCD_EFGH_IJK.list.0=VALUE001*
Class:ABCD_EFGH_IJK.list.1=VALUE002*
Class:ABCD_EFGH_IJK.list.2=VALUE003*
Class:ABCD_EFGH_IJK.list.3=VALUE004*
Class:ABCD_EFGH_IJK:app:ABCD_EFGH_IJK.condition=true
Class:LMNO_PQRS_TUV.list.0=VALUE004*
Class:LMNO_PQRS_TUV.list.1=VALUE005*
Class:LMNO_PQRS_TUV.list.2=VALUE006*
Class:LMNO_PQRS_TUV.list.3=VALUE007*
Class:LMNO_PQRS_TUV:app:LMNO_PQRS_TUV.condition=true

Давайте назовем файл выше myconfig.txt

СейчасВы можете написать цикл for поверх него:

for i in `cat myconfig.txt`
do
if [[ ! $i == *"true"* ]]; then
val=`echo $i|cut -d'=' -f2`  #outputs VALUE001*
class=`echo $a|cut -d':' -f2|cut -d'.' -f1`  # outputs ABCD_EFGH_IJK
./myscript $val $class
fi
done

Примечание. Возможно, это не лучшее решение, но оно поможет вам начать работу.Дайте мне знать, если это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...