Sed-Regex für ein variables Wort unter Ubuntu 14

Sed-Regex für ein variables Wort unter Ubuntu 14

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 -Edie 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:

  1. +wird in grundlegenden regulären Ausdrücken nicht unterstützt. -EAktiviert erweiterte reguläre Ausdrücke, die unterstützt werden +.

  2. \w+passt zu einem oder mehreren Wortzeichen. [\w+]passt zu einem der folgenden Elemente: \, w, oder +.

  3. \wist 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;
    
  4. 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ügt

  • Beim 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;

verwandte Informationen