3 votes

Remplacement sélectif d'une chaîne de caractères par des guillemets à l'aide de sed

J'ai un dossier.

$ cat file
"bar":  false
"foo":  false

Je dois remplacer le mot false con true uniquement dans le modèle "foo": false . Le problème vient des guillemets et des espaces.

J'ai pensé à deux façons :

  1. Pour isoler l'ensemble du motif dans une sorte de qoutes/doubles quotes.
  2. Pour ne remplacer que les "false" précédés d'un "foo".

Un exemple d'essai de 2 options :

$ sed -i 's/\(.*foo\)/false/true\1/g' file

Il a échoué.

10voto

Zanna Points 65764

Utilisez une adresse. Les guillemets ne posent pas de problème si vous mettez votre adresse entre guillemets. sed expression

$ sed '/"foo"/ s/false/true/' file
"bar":  false
"foo":  true

Si vous avez vraiment besoin de faire correspondre l'ensemble du motif, très bien :

$ sed '/"foo": *false/ s/false/true/' file
"bar":  false
"foo":  true

* correspond à n'importe quel nombre du caractère précédent (espace).

Vous pouvez utiliser \s pour faire correspondre également les tabulations (tout espace blanc horizontal) :

sed '/"foo":\s*false/ s/false/true/' file

Ajouter le -i après avoir testé de modifier le fichier original.

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