Como combinar um padrão em linhas antes de outro padrão

0

Esta questão é semelhante a Como mostrar as linhas depois de cada partida do grep até outro jogo específico?

Eu quero corresponder um padrão específico nas linhas antes de outro padrão.

Aqui eu quero pegar o arquivo de um determinado host. Cada arquivo pode ter vários hosts. Portanto, não tenho um número fixo de linhas antes de chegar à tag hostfile de um determinado host.

Contexto:

...
...
<hostfile file:abc.txt>
   <host> abc.com <\host>
   <host> qwe.com <\host>
   <host> xyz.com <\host>
<\hostfile>
...
<hostfile file:xyz.txt>
   <host> asd.com <\host>
<\hostfile>
...
...

Exemplo de correspondência

Input: xyz.com 
Output: abc.txt

Input: asd.com
Output: xyz.txt

Usando o awk ou sed ou qualquer outra ferramenta de linha de comando.

    
por hardik p 01.06.2017 / 00:29

3 respostas

1

Outra variação do awk:

/^<hostfile file:/ {
        output=substr($2, 6, index($2, ">") - 6);
}
/<host>/ && $0 ~ pattern {
        print output
}

Chame como:

$ awk -v pattern='xyz.com' -f findit.awk contextfile
abc.txt
$ awk -v pattern='asd.com' -f findit.awk contextfile
xyz.txt
    
por 01.06.2017 / 03:24
0

Você não pode analisar XML com regex. Porque o XML não pode ser analisado por regex. Regex não é uma ferramenta que pode ser usada para analisar corretamente o XML. Como já respondi em questões de XML e regex tantas vezes antes, o uso de regex não permitirá que você consuma XML. Expressões regulares são uma ferramenta insuficientemente sofisticada para entender as construções empregadas pelo XML. 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 XML em suas partes significativas. muitas vezes, mas não está chegando a mim. Mesmo as expressões regulares irregulares aprimoradas usadas pelo Perl não estão à altura da tarefa de analisar o XML. Você nunca vai me fazer crack. XML é uma linguagem de complexidade suficiente que não pode ser analisada por expressões regulares. Mesmo Jon Skeet não pode analisar XML usando expressões regulares. Toda vez que você tenta analisar XML com expressões regulares, a criança profana chora o sangue de virgens, e os hackers russos preferem seu webapp. Analisar XML com regex convoca almas contaminadas para o reino dos vivos. XML e regex andam juntos como amor, casamento e infanticídio ritual. O < center > Não posso segurar, é tarde demais. A força de regex e XML juntos no mesmo espaço conceitual destruirá sua mente como muita massa aquosa. Se você analisar XML com regex, você estará 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. XML-plus-regexp irá liquefazer os nervos do sensitivo enquanto você observa, sua psique murchando no ataque do horror. baseado em regex analisadores XML são o câncer que está matando StackOverflow que seja tarde demais, é tarde demais, não pode ser salvo o trangession de uma criança garante regex vai consumir todo o tecido vivo (exceto para XML que não pode , como anteriormente profetizou) caro senhor nos ajudar como alguém pode sobreviver a este flagelo a humanidade usando regex para analisar XML foi condenado a uma eternidade de buracos tortura medo e segurança usando rege x como uma ferramenta para processar XML estabelece uma ruptura entre este mundo e o temido domínio das entidades de quebra (como entidades SGML, mas mais corruptas), um mero vislumbre do mundo do reg ex analisadores de XML será ins tantly transportar ap consciência de rogrammer i nto aw orl d de incessante gritos, ele vem , o pestilento sl ithy regex-infecção 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 fi ght h e com̡e̶s , Oi é Unholy Radiance de stro҉ying toda a iluminação, as tags XML vazando fr̶ǫm yo ur olhos como liq uid p ain, a canção de expre regulares ssion análise vai EXTI nguish as vozes de mor homem tal do sp aqui eu posso vê-lo você pode ver que é bonito t , ele f inal snuf Para a mentira s do homem TUDO É LO $ A LL É L OST e pon̷y ele vem s ele greves eu st ele ich ou permeie es al l MEU FAC E meu Deus ᵒh ROSTO n o NO nOO OO N Θ parar t ele um * ̶͑̾̾ GL es ͎a̧͈͖r̽̾̈́͒͑e n ot rè̑ͧ̌aͨl̘̝̙̃ͤ͂̾̆ ZA̡͊͠͝LGΌ ISͮ̂҉̯͈͕̹̘̱ T O͇̹̺ͅƝ̴ȳ̳ TH̘ Ë͖́̉ ͠P̯͍̭O̚N̐Y̡ H̸̡̪̯ͨ͊̽̅̾̎Ȩ̬̩̾͛ͪ̈́̀́͘ ̶̧̨̱̹̭̯ͧ̾ͬC̷̙̲̝͖ͭ̏ͥͮ͟Oͮ͏̮̪̝͍M̲̖͊̒ ͩͬ̚̚͜Ȇ̴̟̟͙̞ͩ͌͝ S

    
por 01.06.2017 / 00:35
0

Eu queria aplicar alguns analisadores XML, mas o "Contexto" apresentado não se encaixa em nenhuma estrutura XML válida (atributos inválidos file:abc.txt , tags de fechamento inválidas <\host> , <\hostfile> ). gawk "hack":

awk  'BEGIN{ RS="<hostfile" }/file:/{ f = substr($1,6,length($1)-6) }
      /<host>/{ match($0,/.*<host>([^<>]+)<\host>[[:space:]]*<\hostfile>.*$/,a);  
      printf("Input: %s\nOutput: %s\n\n",a[1],f)}' yourfile

A saída:

Input:  xyz.com 
Output: abc.txt

Input:  asd.com 
Output: xyz.txt
    
por 01.06.2017 / 01:54