Grep und Ersetzen

Grep und Ersetzen

Ich habe eine Datei mit einem RESOURCESchlüsselwort. Es kann überall in der Datei vorkommen, zum Beispiel:

[email protected]

[email protected]Nun möchte ich durch ersetzen [email protected]. Dazu muss ich die Zeile suchen, in der ich das Schlüsselwort finde RESOURCEund dann das Wort nach dem Gleichheitszeichen ersetzen. Das RESOURCESchlüsselwort muss dabei unverändert bleiben.

Kann mir bitte jemand dabei helfen?

Eingang:

[email protected]

Ausgabe:

[email protected]

Antwort1

grepist in diesem Fall nicht sinnvoll, da Sie den Inhalt der Datei nicht ändern können.

Stattdessen kann man sedFolgendes verwenden:

fromaddr='[email protected]'
toaddr='[email protected]'

sed '/^RESOURCE=/s/='"$fromaddr"'$/='"$toaddr"'/' file >newfile

Gegeben fileals

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

Dies schafft newfileals

some data
[email protected]
[email protected]
[email protected]
[email protected]
more data

Der sedAusdruck wählt Zeilen aus, die mit der Zeichenfolge beginnen RESOURCE. Für jede dieser Zeilen wird die E-Mail-Adresse ersetzt, wenn sie in der Zeile vorhanden ist. Das für die Ersetzung verwendete Muster stellt sicher, dass wir übereinstimmen =und dass die Adresse am Ende der Zeile endet.

Antwort2

Der sedBefehl ist besser.

sed -i 's/[email protected]/[email protected]/' yourfile

Das Obige funktioniert in meinem Test, aber wenn Sie es selbst testen möchten, können Sie zuerst Folgendes versuchen:

sed 's/[email protected]/[email protected]/' yourfile

Dadurch werden die Änderungen in die Standardausgabe geschrieben, ohne dass dies Auswirkungen auf die Datei hat.

In jedem Fall erhalten Sie die gewünschte Änderung von:

[email protected]

Wenn der Wert RESOURCEin der Datei anders ist und Sie ihn in etwas anderes ändern möchten, gehen Sie wie folgt vor:

grep RESOURCE= yourfile

Dadurch wird die Zeile zurückgegeben, in der es sich befindet, und der Wert angezeigt.

Sie können dann

sed 's/[email protected]/[email protected]/' yourfile

Für die Zukunft ist es wichtig, all dies in Ihrer ursprünglichen Frage klarzustellen, damit Sie ohne all diesen Zirkus die benötigte Hilfe erhalten.

Antwort3

Sie scheinen zu sagen, dass Sie die Zeichenfolge ersetzen möchten, die nach dem , erscheint =. egal was es istZum Beispiel,in den Beispieldaten möchten Sie ersetzen . Aber Sie sagen, dass Sie die Zeichenfolge nach dem durch ersetzen möchten, [email protected]egal was sie ist – anscheinend möchten Sie das fest codiert haben.=[email protected]

Es gibt mehrere Varianten, wie man das machen kann. Die einfachste ist

sed 's/RESOURCE=.*/[email protected]/'

was (wie alle folgenden Befehle) die Tatsache nutzt, dass .*„mit allem übereinstimmen soll, was da ist“. Wenn Sie nicht RESOURCE=zweimal tippen möchten, können Sie das obige abkürzen auf

sed 's/\(RESOURCE=\).*/\[email protected]/'

wobei \(\)einen Teil des Suchbegriffs als Gruppe kennzeichnet (maximal neun Gruppen sind möglich) und \1bedeutet, dass durch die erste Gruppe ersetzt wird.

Die obigen Befehle suchen und ersetzen, RESOURCE= wo immer es in der Zeile erscheint. So zum Beispiel die Eingabe

# Lakshminarayana wants to change all occurrences of "RESOURCE=".
[email protected]
[email protected]
[email protected]
FOX RESOURCE=The quick brown fox
# Comment: Originally line 2 said [email protected]

würde geändert werden in

# Lakshminarayana wants to change all occurrences of "[email protected]
[email protected]
[email protected]
[email protected]
FOX [email protected]
# Comment: Originally line 2 said [email protected]

Wenn Sie nur übereinstimmen möchten, wenn RESOURCE=am Anfang einer Zeile steht, verwenden Sie^:

sed 's/^RESOURCE=.*/[email protected]/'

oder

sed 's/^\(RESOURCE=\).*/\[email protected]/'

Wenn Sie nur den Ressourcenwert ersetzen möchten und nicht den gesamten Rest der Zeile – z. B.

[email protected]    [email protected]

Zu

[email protected]   [email protected]

das ist auch möglich. Bearbeiten Sie Ihre Frage so, dass sie genau das ausdrückt, was Sie möchten, mit vollständigen, klaren ErklärungenUndBeispiele.


OK, wählen Sie eine der oben genanntensBefehle. Wenn Sie Ihre Datei nun an Ort und Stelle bearbeiten möchten (wie Sie angegeben haben), tun Sie

sed  -i  {s command }  { yourfile }

Wenn Sie eine neue Datei erstellen möchten,

sed  {s command }  { oldfile }  >  { newfile }

Geben Sie nicht wirklich das{Und}; sie dienen lediglich der Abgrenzung.

verwandte Informationen