Aktualisierung der Frage Muster entsprechen:sed das zweite Auftreten des
Ich habe eine Datei, die unten in einem der beiden Formate Codeblock enthält erwähnt:
1.
$Subj .= "HAD PROBLEMS";
if ($To) {
$Cc = "abc\@example.com";
}
else {
$Cc = "abc\@example.com";
}
2.
$Subj .= "HAD PROBLEMS";
if ($To) { $Cc = "abc\@example.com"; } else { $Cc = "abc\@example.com"; }
ich brauche die E-Mail-ID in $ Cc Variable (2. Vorkommen) mit einem neuen em ersetzen ail ID für beide Formate.
Ich habe den folgenden sed Befehl, dies zu tun.
sed '\|HAD PROBLEMS|,/}/ s/$Cc = \(\"[A-Za-z0-9]*\)\(.*\)\([A-Za-z0-9]*\)\@example.com\"/\$Cc = "new email\\@example.com"/' test.txt
Dieser Befehl wird die E-Mail-ID nur für die $Cc
Variable in dem, wenn {}
Block (erstes Auftreten von $Cc
), da meinem Ende Einstimmungsmuster ist ein ‚}‘ ersetzen. Ich möchte E-Mail-ID in der zweiten $Cc
auch ersetzen. Wie passe ich beim 2. Auftreten von '}'
?
Die unten genannte Lösung funktioniert für das erste Format. Aber ich brauche eine generische Lösung, die für beide Formate funktioniert. Kann mir bitte jemand helfen.
Ich hoffe, die Beschreibung ist klar.
Ihre Eingabe ist nicht klar, beheben Sie die Syntax Probleme im Skript mit einer richtigen erwarteten Ausgabe. – Inian
Warum setzen Sie $ Cc unabhängig von $ To auf denselben Wert? Ist das ein Tippfehler? – codeforester
@Inian, Ihr sed-Skript ersetzt tatsächlich beide Instanzen, aber das ist nicht das, wonach das OP sucht. Er will nur die * zweite * Instanz, die in einem 'else'-Block eines 'if' erscheint, der nach dem Wort' HAS PROBLEMS' steht. Während dies sehr wohl etwas sein könnte, was in sed ausgedrückt werden könnte, würde es wahrscheinlich erfordern, dass seds Speicherplatz und ein Schnipsel wie 'x; s/[az] + \\ @ [az .-] +/new @ Beispiel verwendet wird. com/2; p', sobald Sie herausgefunden haben, wie Sie nur den wichtigen Teil der Datei in den Speicherplatz von sed bringen. Zu spät in der Nacht, um das herauszufinden, also ... awk zur Rettung! – ghoti