sed

sed -n '/I2C/p' at_defconfig | sed -e '/^#/d'        //select items include I2C but no begin with #


Using sed:

sed -n '/<tester>/{n;/<level1[ ]*id="2"/{n;n;N;p}}' input

Explanation:

sed                  # execute sed
-n                   # do not print unless explicitly stated
/<tester>/           # if this line contains <tester>
{                    # then 
n;                   # skip the line (read new line over the old line)
/<level1[ ]*id="2"/  # if this line contains <level1 [spaces] id="2"
{                    # then
n;n;                 # skip it, and skip the next line
N;                   # read another line but this time append
p                    # print the buffer
}                    # end if
}                    # end if

Sample.xml :

` test point lvl3 of id 1 lvl4 of id 1

<tester>
   <level1 id="2"> test point </level1>
   <level2> </level2>
   <level3>lvl3 of id 2 </level3>
   <level4> lvl4 of id 2</level4>
   <level5> </level5>
</tester>

<tester>
   <level1 id="3"> test point </level1>
   <level2> </level2>
   <level3>lvl3 of id 3</level3>
   <level4>lvl4 of id 3</level4>
   <level5> </level5>
</tester>

<tester>
   <level1 id="2"> test point </level1>
   <level2> </level2>
   <level3>lvl3 of id 2 2nd occurance</level3>
   <level4>lvl4 of id 2 2nd occurance</level4>
   <level5> </level5>
</tester>

For the above mentioned sample.xml , I need to get the level3 and level4 tag only if the Id in level1 is 2. For eg : I should get the below answer when I search for id=2

<level3>lvl3 of id 2 </level3>
<level4> lvl4 of id 2</level4>

<level3>lvl3 of id 2 2nd occurance</level3>
<level4>lvl4 of id 2 2nd occurance</level4>

awk -f script.awk file

Contents of script.awk:

/<tester>/ {
    r=""
    f=1
}

f && /<level1 id="2">/ {
    g=1
}

g && /<level[34]>/ {
    sub(/^[ \t]+/, "")
    r = r $0 ORS
}

/<\/tester>/ {
    if (g && r) {
        print r
    }
    f=g=0
}

Results:

<level3>lvl3 of id 2 </level3>
<level4> lvl4 of id 2</level4>

<level3>lvl3 of id 2 2nd occurance</level3>
<level4>lvl4 of id 2 2nd occurance</level4>

Alternatively, here's the one-liner:

awk '/<tester>/ { r=""; f=1 } f && /<level1 id="2">/ { g=1 } g && /<level[34]>/ { sub(/^[ \t]+/, ""); r = r $0 ORS } /<\/tester>/ { if (g && r) print r; f=g=0 }' file


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值