Hilfe beim Kombinieren von sed-Befehlen (Syntax)

Hilfe beim Kombinieren von sed-Befehlen (Syntax)

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

-EFlag 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 $trueoder $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 -eFlag).

verwandte Informationen