Procurar por uma string, em sucesso Pesquisar por padrão mais próximo

1

Eu tenho um arquivo XML de formato,

 {XML file with similar tags - SubRecord and Property}
 ...

 <SubRecord>
 <Property Name="Name">My Main Search Keyword</Property>
 <Property Name="Prompt">Dummy</Property>
 <Property Name="Default">Value i'm Concerned to Modify</Property>
 </SubRecord>

 ...

Meu req. é obter o valor do "Padrão" para esse sub registro específico e atualizá-lo com base na condição. Para isso eu preciso chegar a essa tag "Nome" e modificar seu valor.

Existe alguma maneira de usar o SED / AWK / GREP?

EDIT: Como por atualização de @ terdon:

  • Todas as seções serão apenas uma linha? Não
  • O padrão será sempre o último? Sempre em terceiro da parte superior (nome, prompt, Padrão)
  • Há algo que diferencia maiúsculas de minúsculas? É tudo? Caso Sensível.
  • Existem linhas em branco? Espero que não, mas eu posso fazer algumas pré-possuindo para removê-los.
  • O arquivo está recuado? Sim.

Exemplo:      ...

 <SubRecord>
 <Property Name="Name">Search</Property>
 <Property Name="Prompt">Some Text</Property>
 <Property Name="Default">abc.txt</Property>
 </SubRecord>

 ...

Em um arquivo XML grande com Propert e SubRecords semelhantes, primeiro preciso encontrar todas as propriedades do parâmetro "Search".

Ao encontrar "Pesquisar", preciso verificar o valor padrão. Se é abc.txt, então eu preciso manter esse valor, se for xyx, ainda preciso manter. Além de abc.txt ou xyz, eu preciso atualizá-lo com abc.txt.

    
por Dud 02.05.2017 / 18:44

3 respostas

0

Este é o equivalente a sed:

$ cat file9
 <SubRecord1>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>Value i'm Concerned to Modify</Property>
 </SubRecord1>
 <SubRecord2>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>Do not Modify</Property>
 </SubRecord2>

$ sed -r '/\bSubRecord1\b/!b;n;n;n;s/(<Property Name=Default>)(.*)(<\/Property>)/AAAA/' file9
 <SubRecord1>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>AAAA</Property>
 </SubRecord1>
 <SubRecord2>
 <Property Name=Name>My Main Search Keyword</Property>
 <Property Name=Prompt>Dummy</Property>
 <Property Name=Default>Do not Modify</Property>
 </SubRecord2>

O uso de limites de palavras \b garante que o padrão de sed /SubRecord/ não corresponda a SubRecord1 ou SubRecord2

    
por 03.05.2017 / 01:09
4

O XML deve ser manipulado por uma ferramenta com reconhecimento de XML.

XMLStarlet é uma ferramenta desse tipo.

É assim que você define o valor do nó Property cujo atributo Name é Default e cujo valor não é abc.txt ou xyx :

xml ed -u '//SubRecord/Property[@Name="Default" and . != "xyx" and . != "abc.txt"]' -v 'abc.txt' file.xml

Dado um arquivo XML como o seguinte:

<?xml version="1.0"?>
<Record>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">zzz</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">abc.txt</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">xyx</Property>
  </SubRecord>
</Record>

isso produz

<?xml version="1.0"?>
<Record>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">abc.txt</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">abc.txt</Property>
  </SubRecord>
  <SubRecord>
    <Property Name="Name">My Main Search Keyword</Property>
    <Property Name="Prompt">Dummy</Property>
    <Property Name="Default">xyx</Property>
  </SubRecord>
</Record>

(o primeiro SubRecord foi modificado)

O XMLStarlet está disponível no link (mas verifique primeiro o seu próprio gerenciador de pacotes). Às vezes, seu executável é chamado de xmlstarlet , em vez de apenas xml .

    
por 02.05.2017 / 19:25
3

Você não pode analisar [X] HTML / XML com regex. Porque o HTML / XML não pode ser analisado por regex. Regex não é uma ferramenta que pode ser usada para analisar corretamente HTML / XML. Expressões regulares são uma ferramenta insuficientemente sofisticada para entender as construções empregadas pelo HTML / XML. HTML / XML não é uma linguagem regular e, portanto, não pode ser analisada por expressões regulares. As consultas Regex não estão equipadas para dividir o HTML / XML em suas partes significativas. Mesmo as expressões regulares irregulares aprimoradas usadas pelo Perl não estão à altura da tarefa de analisar HTML / XML. Você nunca vai me fazer crack. HTML / XML são linguagens de complexidade suficiente que não podem ser analisadas por expressões regulares. Mesmo Jon Skeet não pode analisar HTML / XML usando expressões regulares. Toda vez que você tenta analisar HTML / XML com expressões regulares, a criança profana chora o sangue de virgens, e os hackers russos preferem seu webapp. Analisá-los com a regex convoca almas contaminadas para o reino dos vivos. Eles e o regex andam juntos como amor, casamento e infanticídio ritual. O < center > Não posso segurar, é tarde demais. A força de regex e HTML / XML juntos no mesmo espaço conceitual destruirá sua mente como uma massa aquosa demais. Se você analisa regex, você está cedendo a Eles e suas maneiras blasfemas que nos condenam a um trabalho desumano para Aquele cujo Nome não pode ser expresso no Plano Multilíngue Básico, ele vem. O HTML-plus-regexp irá liquefazer as nems do senciente enquanto você observa, sua psique murchando no ataque do horror. Analisadores HTML / XML baseados em Rege̿̔̉x são o câncer que está matando StackOverflow é muito tarde, é tarde demais, não podemos ser salvos a trangessão de um chi ensuresld garante que o regex consuma todo o tecido vivo (exceto HTML que não pode, como previamente profetizado) querido senhor nos ajude como alguém pode sobreviver a esse flagelo usando regex para analisar HTML condenou a humanidade a uma eternidade de terríveis torturas e buracos de segurança usando rege x como uma ferramenta para processar HTML estabelece uma brea ch entre este mundo e o temido domínio de entidades de c͒ͪo͛ͫrrupt (como entidades SGML, mas mais corruptas) um mero vislumbre se do O mundo dos reg ex-analisadores de HTML irá se mover para transportar a consciência do programador para um orl d de gritos incessantes, ele chega , o pestilento sl ithy regex-infection wil l devorará seu HT parser ML, aplicação e existência para todos os tempos como o Visual Basic só pior ele vem ele com es não fi ght h e com̡e̶s, s unhho͞ly radiańcé de stro҉ying todo o enigma, tags HTML lea͠ki̧n͘g fr̶ǫm ̡yo ͢ur olho͢s̸ ̛l̕ik͏e liq uid p ain, a música de exp (s) regressão (s) ssion parsing irá extender nguish as vozes de mor tal man do sp aqui eu posso ver você pode ver que é bonito que ele f inal snuf fing da mentira s do homem TODOS É MAIS A LL I SL OST th e pon̷y ele vem s ele
es ele me st ele ich ou permear es al l MEU FAC E MEU ROSTO ᵒh deus n o NÃO NOO̼
O ON Θ parar t ele um * ̶͑̾̾ ̅ͫ͏̙̤g͇̫͛͆̾ͫ̑͆l͖͉̗̩̳̟̍ͫͥͨ e̠̅s ͎a̧͈͖r̽̾̈́͒͑e n ot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ T O͇̹̺ͅƝ̴ȳ̳ TH̘ Ë͖́̉ ͠P̯͍̭O̚ N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ͧ̾ ̷̙̲̝͖ͭ̏ͥͮ͟C̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ͪͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝

    
por 02.05.2017 / 19:09