Mehrzeilige Perl-Übereinstimmung für „etwas“, das ohne „#\s“ beginnt

Mehrzeilige Perl-Übereinstimmung für „etwas“, das ohne „#\s“ beginnt

AKTUALISIEREN:

  1. Die WIRKLICHE Antwort auf diese MEHRZEILIGE Frage wurde hier von Stephane gegebenhttps://unix.stackexchange.com/a/521560/354415
  2. Alternativ gehen Sie unten Zeile für Zeile mit Perl von Terdon vor:https://unix.stackexchange.com/a/521512/354415
  3. Alternativ gehe ich hier Zeile für Zeile mit IFS selbst durch:https://unix.stackexchange.com/a/521550/354415

Hier ist mein neues Spielzeug:

Das Problem besteht darin, dass ich nur eine Übereinstimmung mit Zeilen erzielen möchte, die keine #\s* vor dem Parameter haben.

Bitte keinen Alternativcode wie sed etc. angeben. Perl verwenden

perl -we 'my $file= "parameter=9
# parameter=10
parameter=10
"; $file=~ s/.*((?<!^# ))parameter\s*=.*/parameter=replaced/g; print(":$file:\n")'

Erwartete Ausgabe

parameter=replaced
# parameter=10
parameter=replaced

PS: Wenn Sie wissen möchten, wie ich damit weitergekommen bin, schauen Sie hier:Vielleicht Perl Negative Lookbehind mit Bypass für variable Länge?

Antwort1

Dies wird dadurch erschwert, dass Sie sich dafür entschieden haben, den mehrzeiligen String als einzelne Variable zu übergeben. Es ist viel einfacher, ihn einfach in ein Array umzuwandeln, sodass Sie den s///Operator in seiner einfachsten Form verwenden können. Versuchen Sie Folgendes: Sie sagten, Sie seien nicht an Codeverbesserungen interessiert, aber um zukünftigen Benutzern zu helfen, finden Sie hier eine vereinfachte Version dessen, was Sie geschrieben haben, die auch die schlechte Praxis vermeidet, ALLCAPS für Nicht-Umgebungsvariablen zu verwenden:

newparameter='parameter=replaced'
filesection='
   parameter=9
# parameter=10
parameter=10
'

matchparamperl='^([^#]*)parameter\s*=.*'

sectionfixed=$( perl -le '
                         @lines=split(/\n/,$ARGV[0]);
                         s/$ARGV[1]/$1$ARGV[2]/g for @lines; 
                         print join "\n", @lines
                         ' "$filesection" "$matchparamperl" "$newparameter") 
echo "$sectionfixed"

Das Ergebnis ist:

$ echo "$sectionfixed"

   parameter=replaced
# parameter=10
parameter=replaced

Alternativ etwas kürzer:

sectionfixed=$( perl -le '
                         do{
                            s/$ARGV[1]/$1$ARGV[2]/g; print
                         } for split(/\n/,$ARGV[0])
                         ' "$filesection" "$matchparamperl" "$newparameter")

Antwort2

perl -we 'my $file= "parameter=9
# parameter=10
parameter=10
"; $file=~ s/.*((?<!# ))parameter\s*=.*/parameter=replaced/g; print(":$file:\n")'

So wird es gemacht )))

Ausgabe:

parameter=replaced
# parameter=10
parameter=replaced

Genannt Negative Lookbehind http://www.blackwasp.co.uk/RegexLookahead.aspx

Danke an Kusalananda für die Idee.

Darauf wäre ich nie gekommen.

Antwort3

contents='
   parameter=9
# parameter=10
parameter=10
'

sed '/^#/!s/parameter[[:blank:]]*=.*/parameter=replaced/' <<<"$contents"

Ausgabe:

   parameter=replaced
# parameter=10
parameter=replaced

Der sedCode wendet die Ersetzung einfach auf alle Zeilen an, die nicht mit einem #Zeichen beginnen.

verwandte Informationen