web-dev-qa-db-fra.com

Remplacer une chaîne par des guillemets de manière sélective à l'aide de sed

J'ai un fichier.

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

Je dois remplacer le mot false par true uniquement dans le motif "foo": false. Le problème est des guillemets et des espaces.

J'ai pensé à deux manières:

  1. Pour isoler l'ensemble du motif dans une sorte de qoutes/doubles guillemets.
  2. Ne remplacer que ce "faux" qui a un "foo" devant lui.

Un exemple d'essais de l'option 2:

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

Ça a échoué.

3
Josef Klimuk

Utilisez une adresse. Les guillemets ne posent pas de problème si vous ne faites que citer votre expression sed

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

Si vous avez vraiment besoin de faire correspondre tout le motif, très bien:

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

* correspond à un nombre quelconque du caractère précédent (espace).

Vous pouvez utiliser \s pour faire également correspondre les tabulations (tous les espaces horizontaux):

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

Ajoutez l'option -i après le test de modification du fichier d'origine.

8
Zanna