2014-10-30 56 views
1

我正在搜索正則表達式的任何匹配之前的行,並且 將輸出放入數組變量中,因此我們可以使用正則表達式匹配行遍歷 另一個數組。通過這種方式,我們知道 需要在每行的 末端將其打印出來時的內容。Bash Array; 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 2014-10-30 16:36:21

+0

我曾經運行下面的一個班輪,以獲得字段名稱和ID由「|」分隔。我現在正在尋找添加'上下文名稱'grep'字段名稱=「。* id =」'file.name | sed -e's /.* field name =「//'-e's /".* id =」/ | /'-e's /".*//'| grep -v「[ - ] 1 $」 – 2014-10-30 16:39:38

+0

@shelter我不確定你在暗示什麼?我只是在尋求幫助。與大多數「卡住」或不是專家的人沒有什麼不同。你的建議是看看其他地方沒有幫助的地方。 – 2014-10-30 16:56:56

回答

0

使用grepsed

$ 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 – 2014-10-30 17:10:29

+0

我收到以下gawk:cmd。 line:1:fatal:match()不能有3個參數 – 2014-10-30 17:56:10

+0

即從編輯 – 2014-10-30 18:28:04