Выделение текста, охватывающего несколько строк, с использованием grep и регулярных выражений - PullRequest
0 голосов
/ 28 августа 2011

Я пытаюсь сопоставить строки с тегом xs: element , который содержит только minOccurs . Как видно ниже, некоторые из них содержат оба критерия поиска в одной строке, некоторые из них занимают несколько строк. Есть ли способ их выбора с помощью grep и регулярных выражений.

<xs:element name="shipto">
  <xs:complexType>
    <xs:sequence>
      <xs:element name="name" type="xs:string"/>
      <xs:element name="address" type="xs:string"/>
      <xs:element name="city" minOccurs="1" type="xs:string"/>
      <xs:element name="country" 
               minOccurs="1" type="xs:string"/>
    </xs:sequence>
  </xs:complexType>
</xs:element>

Правильный вывод должен быть следующим:

<xs:element name="city" minOccurs="1" type="xs:string"/>
<xs:element name="country" 
               minOccurs="1" type="xs:string"/>

Ответы [ 2 ]

2 голосов
/ 28 августа 2011

Советую не разбирать XML с помощью регулярных выражений.Слишком сложно сопоставлять теги с конечными тегами надежным способом.

Существует инструмент командной строки "xpath", использующий XML :: XPath в Perl (пакет Ubuntu libxml-xpath-perl).Пример:

xpath -e '//*[@minOccurs=1]' file.xml

Вывод

-- NODE --
<xs:element name="city" minOccurs="1" type="xs:string" />
-- NODE --
<xs:element name="country" minOccurs="1" type="xs:string" />
1 голос
/ 28 августа 2011

Предполагая, что правильно сформированный XML (т. Е. Нет неоткрытых> внутренних атрибутов), вы, вероятно, можете сделать это:

<xs:element[^>]+?\sminOccurs\s*=[^>]+>

Однако я не уверен, что это будет работать с grep, так как grep соответствуетотдельные строки, поэтому вам может понадобиться написать Perl-скрипт или что-то для этого.

(Обратите внимание, что если у вас есть атрибуты, которые содержат значение sminOccurs=, вам понадобится умнее, но поскольку это, кажется, адресные данные, я предполагаю, что это маловероятно, и ручное удаление всего, что произошло, не будет проблемой.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...