2 votes

Recherche et remplacement multilignes sous Linux

J'ai essayé avec vim, mais je suis ouvert à d'autres idées/suggestions.

Je voudrais effectuer une recherche et un remplacement dans un fichier de 12000 lignes.

Plus précisément, si une occurrence de "^ SetFontSize 28" existe après une définition de "^Hide" et avant le prochain "^Hide" ou "^Show", changez 28 en 18. Exemple ci-dessous.

Voici un extrait du fichier 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

Le résultat final pour le premier bloc "Cacher" ressemblerait à ceci :

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

Remplacement de SetFontSize 28 par SetFontSize 18, mais seulement s'il apparaît dans un bloc "^Hide".

La méchante regex que j'ai essayé dans vim : :%s/^Hide\(.*\)SetFontSize 28$/Hide\1SetFontSize 18/g

Mais on m'a dit que le modèle n'a pas été trouvé. Veuillez me faire savoir si des informations supplémentaires sont nécessaires ou si ma demande n'est pas claire.

2voto

Juste deux corrections :

  • Dans le regexp de Vim, . ne comprend pas de nouvelles lignes. Il existe probablement une meilleure méthode, mais je me contente généralement de faire ce qui suit (.|[\n]) quand j'en ai besoin.
  • * est gourmand, mais vous voulez une correspondance non gourmande ici. {-} fait l'affaire.

Et encore une chose, qui est ma préférence personnelle, alors prenez-la pour ce qu'elle vaut : J'ai eu du mal à me souvenir de ce qui est un caractère magique dans la regexp de Vim, et ce qui ne l'est pas ; j'ai donc fini par utiliser simplement \v au début du motif, de sorte que tous les caractères ASCII, à l'exception de '0'-'9' , 'a'-'z' , 'A'-'Z' y '_' ont une signification particulière.

Dans l'ensemble :

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

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X