2014-10-30 3 views
1

Я ищу строку непосредственно перед любыми совпадениями регулярного выражения и помещает вывод в переменную массива, чтобы мы могли перебирать более еще один массив с линиями соответствия регулярных выражений. Таким образом, мы знаем , каков контекст, когда пришло время распечатать его на конце каждой строки.Баш-массив; 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"> 
+0

Как получается желаемый результат? спецификация о взаимосвязи между полями была бы полезна – nu11p01n73R

+0

Я использовал для запуска ниже один лайнер, чтобы получить имя поля и идентификатор, разделенный символом «|». Теперь я хочу добавить имя контекста 'grep' field name = ". * Id =" 'file.name | sed -e/.* field name = "// '-e' s /".* id ="/|/'-e' s /".*// '| grep -v "[-] 1 $" –

+0

@shelter Я не уверен, что вы предлагаете? Я просто прошу помощи. Ничем не отличается от большинства людей, которые «застряли» или нет экспертов. Ваш совет - смотреть еще раз, где это не полезно вообще. –

ответ

0

Использование grep и sed

$ name=`grep -oP '(?<=context name=")([^"]+)' input` 
$ sed -r "/context/d; s/^.*name=\"([^ ]+)\".*id=\"([^ ]+)\".*$/\1|\2|$name/g" input 

даст результат, как

BID_ASK_LASK_PRICE|0xFBCB|Security 
PX_OPEN_ALL_WITH_SWITCHOVER_RT|0x79F5|Security 
PX_CLOSE_ALL_WITH_SWITCHOVER_RT|0x79F6|Security 
PX_HIGH_ALL_WITH_SWITCHOVER_RT|0x79F7|Security 

ИЛИ если grep оленья кожа поддержка -P

$ name=`sed -r 's/^<context name="([^ ]+)".*$/\1/g;q' input` 
$ sed -r "/context/d; s/^.*name=\"([^ ]+)\".*id=\"([^ ]+)\".*$/\1|\2|$name/g" input 
+0

, это, кажется, останавливается на втором поле для меня и не продолжает итерации. Я считаю, что счетчик <2 –

+0

Я получаю следующий gawk: cmd. line: 1: fatal: match() не может иметь 3 аргумента –

+0

То есть из редактирования –

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