
Ich habe eine Datei mit einem RESOURCE
Schlü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 RESOURCE
und dann das Wort nach dem Gleichheitszeichen ersetzen. Das RESOURCE
Schlüsselwort muss dabei unverändert bleiben.
Kann mir bitte jemand dabei helfen?
Eingang:
[email protected]
Ausgabe:
[email protected]
Antwort1
grep
ist in diesem Fall nicht sinnvoll, da Sie den Inhalt der Datei nicht ändern können.
Stattdessen kann man sed
Folgendes verwenden:
fromaddr='[email protected]'
toaddr='[email protected]'
sed '/^RESOURCE=/s/='"$fromaddr"'$/='"$toaddr"'/' file >newfile
Gegeben file
als
some data
[email protected]
[email protected]
[email protected]
[email protected]
more data
Dies schafft newfile
als
some data
[email protected]
[email protected]
[email protected]
[email protected]
more data
Der sed
Ausdruck 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 sed
Befehl 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 RESOURCE
in 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 ist—
Zum 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 \1
bedeutet, 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 genanntens
Befehle. 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.