it-swarm.com.de

Ersetzen eines Strings durch Anführungszeichen mit sed

Ich habe eine Akte.

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

Ich muss das Wort false nur im Muster "foo": false durch true ersetzen. Das Problem sind Anführungszeichen und Leerzeichen.

Ich dachte über zwei Möglichkeiten nach:

  1. Um das gesamte Muster in eine Art Anführungszeichen zu setzen.
  2. Nur solche "falschen" zu ersetzen, die ein "foo" vor sich haben.

Ein Beispiel für die Option 2:

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

Es ging schief.

3
Josef Klimuk

Verwenden Sie eine Adresse. Die Anführungszeichen sind kein Problem, wenn Sie Ihren Ausdruck sed in einfache Anführungszeichen setzen

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

Wenn Sie wirklich das ganze Muster abgleichen müssen, gut:

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

* entspricht einer beliebigen Zahl des vorhergehenden Zeichens (Leerzeichens).

Sie können \s verwenden, um auch Tabulatoren abzugleichen (alle horizontalen Leerzeichen):

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

Fügen Sie nach dem Testen die Option -i hinzu, um die ursprüngliche Datei zu ändern.

8
Zanna