
AKTUALISIEREN:
- Die WIRKLICHE Antwort auf diese MEHRZEILIGE Frage wurde hier von Stephane gegebenhttps://unix.stackexchange.com/a/521560/354415
- Alternativ gehen Sie unten Zeile für Zeile mit Perl von Terdon vor:https://unix.stackexchange.com/a/521512/354415
- 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 sed
Code wendet die Ersetzung einfach auf alle Zeilen an, die nicht mit einem #
Zeichen beginnen.