2015-11-30 2 views
1

Мы используем инструмент (интеграция данных пентахо), который использует XML как макет для своих файлов. Он хранит слишком много информации в этих файлах (например, информацию о подключении). Прежде чем нажимать файлы на Git, я хочу очистить все блоки соединений, которые используют JNDI. Если я использую XSLT (что может быть возможно), объекты будут разрешены. Это заставит Git видеть много изменений каждый раз, когда я делаю небольшие изменения, что явно нежелательно.Использование SED для удаления всех элементов XML, имеющих определенные значения

У меня есть XML-файл, содержащий следующие строки:

<connections> 
    <connection> 
     <name>connection1</name> 
     <server/> 
     <type>POSTGRESQL</type> 
     <access>JNDI</access> 
     <database>connections&#x2f;test&#x2f;connection1</database> 
     <port>-1</port> 
     <username/> 
     <password>Encrypted </password> 
    </connection> 
    <connection> 
     <name>test</name> 
     <server>asdf</server> 
     <type>ORACLE</type> 
     <access>Native</access> 
     <database>asdf</database> 
     <port>1521</port> 
     <username>asdf</username> 
     <password>zcv</password> 
    </connection> 
</connections> 

Я хочу, чтобы уменьшить его:

<connections> 
    <connection> 
     <name>test</name> 
     <server>asdf</server> 
     <type>ORACLE</type> 
     <access>Native</access> 
     <database>asdf</database> 
     <port>1521</port> 
     <username>asdf</username> 
     <password>zcv</password> 
    </connection> 
</connections> 

Я не могу использовать XSLT-анализатор (например XMLStarlet), так как это будет проанализировать ссылку на объект (&#x2f; становится /).

Я пробовал с СЕПГ:

sed -ne '/<connection>/+.*/<access>/JNDI<\/access>/[\s\S]+.*<\/connection>/d' 

но не повезло там.

+1

Вы не хотите использовать sed для обработки XML. – Tomalak

+4

Почему проблемы с разрешениями возникают? Если это XML, то два представления эквивалентны. Если это не XML, вопрос ошибочен (и у вас большие проблемы). В любом случае, sed, вероятно, является неправильным инструментом для работы. –

+0

Мы используем инструмент (интеграция данных пентахо), который использует XML как макет для своих файлов. Он хранит слишком много информации в этих файлах (например, соединение, как описано в примере). Прежде чем нажимать файлы на GIT, я хочу очистить все блоки соединений, которые используют JNDI. Если я использую XSLT (что может быть возможно), объекты будут разрешены. Это заставит GIT видеть много изменений каждый раз, когда вы хотите загрузить незначительные изменения. Излишне говорить, что этого мы скорее не хотим. –

ответ

1

Это может работать для вас (GNU СЭД):

sed '/<connection>/!b;:a;N;/<\/connection>/!ba;/<access>JNDI<\/access>/d' file 

Это отфильтровывает соединения, которые имеют доступ JNDI. Однако это будет сделано только в том случае, если XML представлен как есть.

+0

Спасибо за ваш ответ. Я пробовал это и получил следующее сообщение: 'sed: 1:"/ /! B;: a; N;/... ": undefined label ';: a; N;/<\/связь> /!ba;/ JNDI <\/access>/d'' –

+0

@RobSmienk Я предлагаю окружать команды одинарными кавычками и разделять каждую команду с помощью переключателя '-e', то есть' sed -e '/ /! b' -e ': a '-e' N '-e'/<\/connection> /! ba '-e'/ JNDI <\/access>/d 'file' – potong

+0

Это сделало трюк! благодаря! –

3

sed не подходит для обработки XML. Если вы хотите сделать это правильно, используйте инструмент XML-aware.

xsltproc будет таким инструментом. Используйте его с преобразованием XSL, как это:

<!-- dropJNDI.xsl -->  
<xsl:transform xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"> 
    <xsl:output method="xml" encoding="UTF-8" indent="yes" /> 

    <!-- output every node unchanged --> 
    <xsl:template match="@*|node()"> 
     <xsl:copy> 
      <xsl:apply-templates select="@*|node()"/> 
     </xsl:copy> 
    </xsl:template> 

    <!-- except connection nodes with access = JNDI, do not output them --> 
    <xsl:template match="connection[access = 'JNDI']" /> 
</xsl:transform> 

использование

xsltproc dropJNDI.xsl input.xml > output.txt 
+0

Мы используем инструмент (интеграция данных пентахо), который использует XML как макет для своих файлов. Он хранит слишком много информации в этих файлах (например, соединение, как описано в примере). Прежде чем нажимать файлы на GIT, я хочу очистить все блоки соединений, которые используют JNDI. Если я использую XSLT (что может быть возможно), объекты будут разрешены. Это заставит GIT видеть много изменений каждый раз, когда вы хотите загрузить незначительные изменения. Излишне говорить, что этого мы скорее не хотим. –

+1

Hm. если вы всегда проходите через XSLT в качестве обычной части процесса сборки, тогда все сущности будут последовательно декодироваться. Выполнение этого с помощью регулярного выражения вызывает проблемы, и я бы настоятельно рекомендовал его. – Tomalak

Смежные вопросы