.png)
Ich habe eine Datei mit vielen Zeilen, wie folgt
, foo = $true
, foo = $false
foo = $true, <--- single space after comma
foo = $false, <-- single space after comma
Um diese Saiten zu ersetzen, kann ich
#!/bin/bash
sed -i 's/, foo = $true/bar/g' file
sed -i 's/, foo = $false/bar/g' file
sed -i 's/foo = $true, /bar/g' file
sed -i 's/foo = $false, /bar/g' file
oder ketten Sie sie an, was genauso schlimm ist
sed -i -e 's/, foo = $true/bar/g' -e 's/, foo = $false/bar/g' -e 's/foo = $true, /bar/g' ... file
Aber gibt es eine Möglichkeit, alle Iterationen mit einem einzigen Sed-Befehl auszuführen?
sed -i 's/[,\ ].*foo = [$false\|$true][,\ ]/bar/g' file
Antwort1
sed -Ei 's/,{,1} {,1}foo = \$(true|false),{,1} {,1}/bar/g' file
sed -Ei 's/(, ){,1}foo = \$(true|false)(, ){,1}/bar/g' file
-E
Flag aktiviert erweiterte reguläre Ausdrücke, die die Verwendung von (){}|
Metazeichen ohne Escape-Zeichen ermöglichen.
(, ){,1}
entspricht 0 (impliziert) bis 1 Vorkommen von,
.\$(true|false)
Übereinstimmungen$true
oder$false
.
Bedenke, dass
sed -i -e 's/, foo = $true/bar/g' -e 's/, foo = $false/bar/g' -e 's/foo = $true, /bar/g' ... file
ist ein einzelner Sed-Befehl, aber mit verschiedenen Skripten (eines für jedes -e
Flag).