找到匹配后,获取2个字符串之间的所有行

时间:2015-12-02 15:15:47

标签: regex bash shell sed

我有一个看起来像这样的XML文件:

    <verzekerde>
          <voorletters>FD</voorletters>
          <tussenvoegsel> </tussenvoegsel>
          <achternaam>King</achternaam>
          <adres>
            <straat>Kingsroad</straat>
            <huisnummer>115</huisnummer>
            <toevoeging> </toevoeging>
            <postcode>1123 GP</postcode>
            <plaats>KINGSTOWN</plaats>
            <land>NL</land>
          </adres>
        </verzekerde>

<verzekerde>
      <voorletters>F</voorletters>
      <tussenvoegsel> </tussenvoegsel>
      <achternaam>Prince</achternaam>
      <adres>
        <straat>Prince Avenue</straat>
        <huisnummer>5</huisnummer>
        <toevoeging> </toevoeging>
        <postcode>1225 PG</postcode>
        <plaats>PRINCETOWN</plaats>
        <land>NL</land>
      </adres>
    </verzekerde>
    <verzekerde>
          <voorletters>C</voorletters>
          <tussenvoegsel> </tussenvoegsel>
          <achternaam>Queen</achternaam>
          <adres>
            <straat>Queensroad</straat>
            <huisnummer>11</huisnummer>
            <toevoeging> </toevoeging>
            <postcode>1113 GP</postcode>
            <plaats>KINGSTOWN</plaats>
            <land>NL</land>
          </adres>
        </verzekerde>

如果字符串KINGSTOWN存在,我想在<verzekerde></verzekerde>之间提取所有部分,因此结果应为:

<verzekerde>
              <voorletters>FD</voorletters>
              <tussenvoegsel> </tussenvoegsel>
              <achternaam>King</achternaam>
              <adres>
                <straat>Kingsroad</straat>
                <huisnummer>115</huisnummer>
                <toevoeging> </toevoeging>
                <postcode>1123 GP</postcode>
                <plaats>KINGSTOWN</plaats>
                <land>NL</land>
              </adres>
            </verzekerde>
        <verzekerde>
              <voorletters>C</voorletters>
              <tussenvoegsel> </tussenvoegsel>
              <achternaam>Queen</achternaam>
              <adres>
                <straat>Queensroad</straat>
                <huisnummer>11</huisnummer>
                <toevoeging> </toevoeging>
                <postcode>1113 GP</postcode>
                <plaats>KINGSTOWN</plaats>
                <land>NL</land>
              </adres>
            </verzekerde>

我试过了sed -n '/KINGSTOWN/,/\<\/verzekerde\>/p',但这只给了我从<plaats>KINGSTOWN</plaats></verzekerde>

的行

有没有办法让这些行达到<verzekerde>? 我想将它集成在一个bash脚本中。 谢谢你帮助我!

2 个答案:

答案 0 :(得分:2)

使用xpath grep XML文档。

给出以下XML文档。

<root>
<verzekerde>
      <voorletters>FD</voorletters>
      <tussenvoegsel> </tussenvoegsel>
      <achternaam>King</achternaam>
      <adres>
        <straat>Kingsroad</straat>
        <huisnummer>115</huisnummer>
        <toevoeging> </toevoeging>
        <postcode>1123 GP</postcode>
        <plaats>KINGSTOWN</plaats>
        <land>NL</land>
      </adres>
    </verzekerde>

<verzekerde>
  <voorletters>F</voorletters>
  <tussenvoegsel> </tussenvoegsel>
  <achternaam>Prince</achternaam>
  <adres>
    <straat>Prince Avenue</straat>
    <huisnummer>5</huisnummer>
    <toevoeging> </toevoeging>
    <postcode>1225 PG</postcode>
    <plaats>PRINCETOWN</plaats>
    <land>NL</land>
  </adres>
</verzekerde>
<verzekerde>
      <voorletters>C</voorletters>
      <tussenvoegsel> </tussenvoegsel>
      <achternaam>Queen</achternaam>
      <adres>
        <straat>Queensroad</straat>
        <huisnummer>11</huisnummer>
        <toevoeging> </toevoeging>
        <postcode>1113 GP</postcode>
        <plaats>KINGSTOWN</plaats>
        <land>NL</land>
      </adres>
    </verzekerde>
</root>

以下命令

$ xpath -q -e '//verzekerde[adres/plaats/text()="KINGSTOWN"]' data.xml 

提取您要查找的节点

<verzekerde>
      <voorletters>FD</voorletters>
      <tussenvoegsel> </tussenvoegsel>
      <achternaam>King</achternaam>
      <adres>
        <straat>Kingsroad</straat>
        <huisnummer>115</huisnummer>
        <toevoeging> </toevoeging>
        <postcode>1123 GP</postcode>
        <plaats>KINGSTOWN</plaats>
        <land>NL</land>
      </adres>
    </verzekerde>
<verzekerde>
      <voorletters>C</voorletters>
      <tussenvoegsel> </tussenvoegsel>
      <achternaam>Queen</achternaam>
      <adres>
        <straat>Queensroad</straat>
        <huisnummer>11</huisnummer>
        <toevoeging> </toevoeging>
        <postcode>1113 GP</postcode>
        <plaats>KINGSTOWN</plaats>
        <land>NL</land>
      </adres>
    </verzekerde>

该命令在以下包中的Debian上:

$ dpkg -S $(type -p xpath)
libxml-xpath-perl: /usr/bin/xpath

答案 1 :(得分:0)

awk救援!

$ awk 'BEGIN{ORS=RS="</verzekerde>\n"} /KINGSTOWN/' xml