Multiline Search and Replace no Linux

1

Tentei isso com o vim, mas aberto a outras idéias / sugestões.

Gostaria de realizar uma pesquisa e substituir em um arquivo com 12.000 linhas.

Especificamente, se uma ocorrência de "^ SetFontSize 28" existir após uma definição "^ Hide" e antes do próximo "^ Hide" ou "^ Show", altere 28 para 18. Exemplo abaixo.

Aqui está um trecho do arquivo original.

Hide # Gear - Endgame
    ItemLevel >= 77
    Rarity = Magic
    LinkedSockets >= 3
    BaseType "Runic Hatchet"
    SetTextColor 140 190 255 # Magic Item Highlight
    SetFontSize 28

Hide # Gear - Endgame
    ItemLevel >= 77
    Rarity = Magic
    Sockets >= 3
    BaseType "Runic Hatchet"
    SetTextColor 140 190 255 # Magic Item Highlight
    SetFontSize 28

Show # Gear - Endgame
    ItemLevel >= 83
    Rarity = Normal
    Sockets < 3
    BaseType "Tiger Hook"
    SetTextColor 240 240 240 # Normal Item Highlight
    SetBackgroundColor 70 70 70
    SetFontSize 28

O resultado final do primeiro bloco "Ocultar" ficaria assim:

Hide # Gear - Endgame
    ItemLevel >= 77
    Rarity = Magic
    LinkedSockets >= 3
    BaseType "Runic Hatchet"
    SetTextColor 140 190 255 # Magic Item Highlight
    SetFontSize 18

Substituindo SetFontSize 28 para SetFontSize 18, mas somente se aparecer em um bloco "^ Hide".

O regex desagradável que eu tentei no vim: :%s/^Hide\(.*\)SetFontSize 28$/HideSetFontSize 18/g

Mas foi dito padrão não encontrado. Por favor, deixe-me saber se alguma informação adicional é necessária ou se o meu pedido não é claro.

    
por Guy 20.02.2016 / 19:29

1 resposta

1

Apenas duas correções:

  • No regexp do Vim, . não inclui novas linhas. Provavelmente existe uma maneira melhor, mas eu costumo fazer (.|[\n]) quando eu preciso disso.
  • * é ganancioso, mas você quer uma correspondência não-gananciosa aqui. {-} faz o truque.

E mais uma coisa, que é minha preferência pessoal, então leve para o que vale: Eu tive dificuldade em lembrar o que é o personagem mágico no regexp de Vim, e o que não é; então acabei usando apenas \v no início do padrão, para que todos os caracteres ASCII, exceto '0'-'9' , 'a'-'z' , 'A'-'Z' e '_' tenham um significado especial.

Ao todo:

%s/\v^Hide((.|[\n]){-})SetFontSize 28/HideSetFontSize 18/g

    
por 20.02.2016 / 19:53

Tags