
Gegeben sei eine Datei mit der folgenden Zeichenfolge:
fastcgi_param WP_ENV staging;
Ich brauche einen Sed-Ausdruck, der das Wort „Staging“ durch eine neue Zeichenfolge ersetzt:
fastcgi_param WP_ENV production;
Im ersten Beispiel ist das dritte Wort variabel. Es könnte jede beliebige Zeichenfolge in Kleinbuchstaben sein, z. B. „Entwicklung“, „lokal“ usw.
Ich habe Folgendes versucht:
sed 's/fastcgi_param WP_ENV [\w+]/fastcgi_param WP_ENV production/g'
aber es erkennt das Wort nicht richtig. Der reguläre Ausdruck für das Wort stimmt nicht überein.
Was wäre der richtige Sed-Befehl für diese Art der Ersetzung?
Antwort1
Fügen Sie -E
die eckigen Klammern hinzu bzw. entfernen Sie sie:
$ sed -E 's/fastcgi_param WP_ENV \w+/fastcgi_param WP_ENV production/g' file
fastcgi_param WP_ENV production;
Anmerkungen:
+
wird in grundlegenden regulären Ausdrücken nicht unterstützt.-E
Aktiviert erweiterte reguläre Ausdrücke, die unterstützt werden+
.\w+
passt zu einem oder mehreren Wortzeichen.[\w+]
passt zu einem der folgenden Elemente:\
,w
, oder+
.\w
ist nicht portierbar. Für die POSIX-Kompatibilität verwenden Sie:$ sed -E 's/fastcgi_param WP_ENV [[:alnum:]]+/fastcgi_param WP_ENV production/g' file fastcgi_param WP_ENV production;
Sie können die doppelte Typisierung der Zeile vermeiden, indem Sie eine Erfassungsgruppe verwenden:
$ sed -E 's/(fastcgi_param WP_ENV) [[:alnum:]]+/\1 production/g' file fastcgi_param WP_ENV production;
Antwort2
Tun:
sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/'
^(([^[:blank:]]+[[:blank:]]+){2})
gleicht die ersten beiden Wörter ab und fügt diese in die erfasste Gruppe ein, sodass wir im Ersetzungsvorgang auf die Gruppe verweisen können[[:lower:]]+
entspricht einem oder mehreren Kleinbuchstaben(.*)
stimmt mit dem verbleibenden Teil der Zeile überein und wird in die erfasste Gruppe eingefügtBeim Ersetzen haben wir die erfasste Gruppe beibehalten, 1 (erste zwei Wörter mit nachfolgendem Leerzeichen) und 3 (Teil nach den gewünschten Kleinbuchstaben, die ersetzt werden sollen). Dazwischen wird die gewünschte Ersetzungszeichenfolge angegeben.
Beispiel:
% sed -E 's/^(([^[:blank:]]+[[:blank:]]+){2})[[:lower:]]+(.*)/\1production\3/' <<<'fastcgi_param WP_ENV staging;'
fastcgi_param WP_ENV production;