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 von sed -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 der sed selbst in meinem zweiten Befehl, um sicherzustellen, dass ' das tut, was Sie wollen, und verwenden Sie dann die sed -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 dann sed -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.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.