Я ищу строку непосредственно перед любыми совпадениями регулярного выражения и помещает вывод в переменную массива, чтобы мы могли перебирать более еще один массив с линиями соответствия регулярных выражений. Таким образом, мы знаем , каков контекст, когда пришло время распечатать его на конце каждой строки.Баш-массив; Sed AWK
<context name="Security" category="security" type="generic" optimizeSize="1">
<field name="BID_ASK_LASK_PRICE" type="double" id="0xFBCB" sequence="1" defaultValue="!null"/>
<field name="PX_OPEN_ALL_WITH_SWITCHOVER_RT" type="double" id="0x79F5" sequence="1" defaultValue="!null"/>
<field name="PX_CLOSE_ALL_WITH_SWITCHOVER_RT" type="double" id="0x79F6" sequence="1" defaultValue="!null"/>
<field name="PX_HIGH_ALL_WITH_SWITCHOVER_RT" type="double" id="0x79F7" sequence="1"
Возможно, появился искомый столбец Имя поля | id | Контекст. В примере
CURRENT_SESSION_RT|0xFBCB|Security
PX_OPEN_ALL_WITH_SWITCHOVER_RT|0x79F5|Security
Текущая логика выглядит следующим образом
#!/bin/bash
array=($(sed -n '/field name/{g;1!p;};h' $1))
array2=($(sed -n '/field name/p' $1))
for ((i=0;i<${#array[@]};++i)); do
ref=$(printf "${array2[1]}|" | sed 's/\"//g' | awk -F "=" '{print $2}')
name=$(printf "${array2[2]}|" | sed 's/[\"\>]//g' | awk -F "=" '{print $2}')
id=$(printf "${array[i]}\n" | sed 's/\"//g' | awk -F "=" '{print $2}')
printf "${ref}${name}${id}\n"
done
Похоже, он не перебор и добавления правильно, как выход только повторяет следующий
BID_ASK_LAST_PRICE|double|
BID_ASK_LAST_PRICE|double|"Security"
BID_ASK_LAST_PRICE|double|"security"
BID_ASK_LAST_PRICE|double|"generic"
BID_ASK_LAST_PRICE|double|"1">
BID_ASK_LAST_PRICE|double|
BID_ASK_LAST_PRICE|double|"Security"
BID_ASK_LAST_PRICE|double|"security"
BID_ASK_LAST_PRICE|double|"generic"
BID_ASK_LAST_PRICE|double|"1">
Как получается желаемый результат? спецификация о взаимосвязи между полями была бы полезна – nu11p01n73R
Я использовал для запуска ниже один лайнер, чтобы получить имя поля и идентификатор, разделенный символом «|». Теперь я хочу добавить имя контекста 'grep' field name = ". * Id =" 'file.name | sed -e/.* field name = "// '-e' s /".* id ="/|/'-e' s /".*// '| grep -v "[-] 1 $" –
@shelter Я не уверен, что вы предлагаете? Я просто прошу помощи. Ничем не отличается от большинства людей, которые «застряли» или нет экспертов. Ваш совет - смотреть еще раз, где это не полезно вообще. –