Ich habe eine Datei mit dem Schlüsselwort RESOURCE
. Es kann an einer beliebigen Stelle in der Datei auftreten, z. B.:
[email protected]
Jetzt möchte ich [email protected]
durch [email protected]
. Ich muss nach der Zeile suchen, in der ich das Schlüsselwort RESOURCE
finden kann, und dann das Wort nach dem Gleichheitszeichen ersetzen. Das Schlüsselwort RESOURCE
muss unverändert bleiben.
Könnte mir bitte jemand dabei helfen?
Eingabe:
[email protected]
Ausgabe:
[email protected]
Antwort
grep
ist in diesem Fall nicht hilfreich, da Sie den Inhalt der Datei nicht ändern können.
Stattdessen kann sed
wie folgt:
fromaddr="[email protected]" toaddr="[email protected]" sed "/^RESOURCE=/s/=""$fromaddr""$/=""$toaddr""/" file >newfile
Geben Sie file
als
an
some data [email protected] [email protected] [email protected] [email protected] more data
Dadurch wird newfile
als
some data [email protected] [email protected] [email protected] [email protected] more data
erstellt sed
Ausdruck wählt Zeilen aus, die mit der Zeichenfolge RESOURCE
beginnen. 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 mit der =
übereinstimmen und die Adresse endet am Ende der Zeile.
Kommentare
- Ich möchte [email protected] nicht hart codieren, es sollte so etwas wie nasir37 @ yahoo sein Ich möchte durch ein anderes wie [email protected] ersetzen. Es sollte dynamisch sein – Lakshminarayana gerade bearbeiten
- @Lakshminarayana Siehe aktualisierte Antwort.
- Ich möchte nicht Schreiben Sie es erneut in eine neue Datei, da die Datei auch aus anderen Daten besteht. Wie unten.
- @Lakshminarayana Führen Sie dann
sed -i
aus, wenn Sie denken ' macht das Richtige und ' leitet nicht in eine neue Datei um. I ' Ich vermeide generell die Verwendung vonsed -i
, da ' nicht portierbar ist und seitdem, wenn Sie einen Typ erstellen o, es kann Ihre ursprünglichen Daten zerstören. - Ich verstehe das. Wie kann ich nach der Zeile suchen, die das RESOURCE-Wort enthält? Ich muss es in einer Datei suchen, die andere Daten enthält, und es ersetzen. Außerdem muss ich den Dateinamen als Parameter übergeben
Antwort
Die 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 dies zuerst versuchen:
sed "s/[email protected]/[email protected]/" yourfile
Damit werden die Änderungen in die Standardausgabe geschrieben, ohne dass dies Auswirkungen auf die Datei hat.
In beiden Fällen erhalten Sie die gewünschte Änderung von:
[email protected]
Wenn der Wert von RESOURCE
in der Datei unterschiedlich ist und Sie etwas anderes ändern möchten, dann:
grep RESOURCE= yourfile
Damit wird die Zeile zurückgegeben, in der sie sich befindet, und der Wert angezeigt.
Sie können dann
sed "s/[email protected]/[email protected]/" yourfile
verwenden
Zum späteren Nachschlagen ist es wichtig, all dies in Ihrer ursprünglichen Frage klar zu machen, damit Sie die Hilfe erhalten, die Sie ohne all dieses Rigamarol benötigen.
Kommentare
- Ich möchte [email protected] nicht hart codieren, es sollte so etwas wie [email protected] sein. Ich möchte es durch ein anderes wie [email protected] ersetzen sei dynamisch
- Ich verstehe ' nicht, was Sie meinen. In Ihrer Frage wird angezeigt, dass die Ausgabe
[email protected]
sein soll, was beide Antworten erreichen. Was meinst du mit: " Ich möchte [email protected] " nicht hart codieren? und " sollte dynamisch sein "? - @Lakshminarayana Wenn Sie möchten, dass die Änderungen tatsächlich am vorgenommen werden Datei dann verwenden Sie
sed i
wie ich in meinem ersten Befehl gegeben habe. Testen Sie es zuerst mit dersed
selbst in meinem zweiten Befehl, um sicherzustellen, dass ' das tut, was Sie wollen, und verwenden Sie dann diesed -i
in meinem ersten Befehl, sobald Sie ' sicher sind, dass es funktioniert. - Ich meine, ich möchte keinen harten Code Sie. sed ' s / RESOURCE = Lnreddy37 @ gmail.com / RESOURCE = reddy17777 @ gmail.com / ' yourfile. Ich möchte es wie Parameter sowohl Eingabe als auch Ausgabe übergeben.Außerdem möchte ich nach der Zeile suchen, in der ich RESOURCE habe, und diese ersetzen.
- @Lakshminarayana Verwenden Sie dann entweder die Antwort von Kusalananda ' und übergeben Sie die E-Mail-Adressen Rufen Sie für eine Variable oder
grep RESOURCE= file
die angezeigte E-Mail-Adresse ab, verwenden Sie dannsed -i
und ersetzen Sie[email protected]
und[email protected]
mit allem, was da ist und was immer Sie wollen.
Antwort
Sie scheinen zu sagen, dass Sie die Zeichenfolge ersetzen möchten, die nach =
angezeigt wird, egal was es ist – zum Beispiel , in den Beispieldaten möchten Sie . Aber Sie sagen, dass Sie die Zeichenfolge nach =
durch [email protected]
ersetzen möchten – anscheinend möchten Sie dies das fest codiert.
Es gibt einige Variationen, wie das geht. Das einfachste ist
sed "s/RESOURCE=.*/[email protected]/"
, das (wie alle folgenden Befehle) die Tatsache verwendet, dass .*
„mit was auch immer übereinstimmen“ bedeutet Gibt es“. Wenn Sie RESOURCE=
nicht zweimal eingeben möchten, können Sie die obigen Angaben auf
sed "s/\(RESOURCE=\).*/\[email protected]/"
verkürzen, wobei \(
… \)
markiert einen Teil der Suchzeichenfolge als Gruppe (Sie können bis zu neun Gruppen haben) und \1
bedeutet Ersetzen durch die erste Gruppe.
Die obigen Befehle suchen und ersetzen RESOURCE=
, wo immer es in der Zeile erscheint. So würde beispielsweise 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]
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]
If geändert Wenn Sie nur übereinstimmen möchten, wenn RESOURCE=
am Zeilenanfang angezeigt wird, verwenden Sie ^
:
sed "s/^RESOURCE=.*/[email protected]/"
oder
sed "s/^\(RESOURCE=\).*/\[email protected]/"
Wenn Sie nur den Ressourcenwert und nicht den gesamten Rest der Zeile ersetzen möchten, z. B.
[email protected] [email protected]
bis
[email protected] [email protected]
das kann auch gemacht werden. Bearbeiten Sie Ihre Frage, um genau zu sagen, was Sie möchten, mit vollständigen, klaren Erklärungen und .
OK, wählen Sie eine der oben genannten s
Befehle. Wenn Sie nun Ihre Datei an Ort und Stelle bearbeiten möchten (wie angegeben), führen Sie
sed -i { s command } { yourfile }
aus. Wenn Sie eine neue Datei erstellen möchten, führen Sie
sed { s command } { oldfile } > { newfile }
Geben Sie nicht {
und }
; Sie dienen nur zur Abgrenzung.