Selection of a range of lines from a huge file

HI All,

I have an xml file(test.xml) with the content as given below.Its a huge file,i have only given a part of it)

<row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>12</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    
    <row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>13</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    
    <row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>14</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    
    <row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>19</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    
    <row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>12</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    
    <row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>13</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    <row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>14</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    
    <row>
        <id>
            <name>abc</name>
            <group>server</group>
            <install>Y</install>
            <boot>N</boot>
            <></>
        </id>
        <source_name>19</source_name>
        <data>123<data>
        <datatype>I</datatype>
    </row>
    
    ...............
    
    ................
    
    ...............

 

I want to print only the blocks(<row>.. </row>) where the <source_name>19</source_name> is present.(I want only the data corresponding to source 19).I am trying with the below code.

grep -B8 -A3 "<source_name>19</source_name>" test.xml > test_new.xml

i have the output ,but is there any other efficient way to perform this?.Kindly suggest

Try

sed -n '/row/ {:L; N; /\/row/ !bL; /<source_name>19<\/source_name>/ p; }' file

When found row , collect following lines until /row , and if the pattern space contains source...19... , print, else ignore.

2 Likes