Wie kann ich den Wert einer Zeile innerhalb einer Datei abrufen und ändern, wenn mir der Wert dieser Zeile nicht bekannt ist?

Wie kann ich den Wert einer Zeile innerhalb einer Datei abrufen und ändern, wenn mir der Wert dieser Zeile nicht bekannt ist?

Was ich versuche, ist Folgendes: Es gibt eine Datei und darin eine Zeile (sie wird mit Sicherheit da sein, 100 %) in diesem Modell:

name_of_the_value=xxx

Wo der Wert istNumerischUnd Unbekanntvon mir, weil es sich von Gerät zu Gerät ändert ... Ich muss den xxxWert irgendwie abrufen und ihn durch einen anderen Wert ersetzen, der vom Benutzer über ein TextField(ich verwende hierfür Java, es ist für eine Android-Anwendung, aber es ist sowieso ein reines Shell-Skript) angegeben wird.

Ist gültig:

  1. Suchen und löschen Sie die ganze Zeile und ersetzen Sie sie durch die vollständige Zeile, z. B. löschen name_of_the_value=xxxund ersetzen durchname_of_the_value=user_value
  2. Ersetzen Sie nur den xxx(Wert-)Teil
  3. Kommentieren Sie alle vorhandenen übereinstimmenden Zeilen mit '#' und schreiben Sie die vollständige Zeile an das Ende der Datei

Aber wie kann ich es verwenden echo, sedwenn awkich den Wert nicht kenne?

Antwort1

Vorausgesetzt, der Teil für user_value ist immer 3 Zeichen lang, können Sie es folgendermaßen machen:

sed "s/name_of_the_value=.{0,3}/name_of_the_value=$new_value/"

Oder wenn Sie sicher sind, dass hinter dieser Zeile nichts steht, können Sie auch Folgendes verwenden:

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/"

Ich hoffe, ich habe den REGEX richtig verstanden, ich bin da kein Profi. Der Wert sollte also immer 3 Zeichen lang sein, am besten im Hex-Format, da Dezimalzahlen in Fällen unter 100 nicht immer 3 Zeichen lang sind. Der zweite Fall sollte auch funktionieren, wenn die Zahl unter 100 liegt, aber es wird angenommen, dass der ganze name_of_the_value=user_valueTeil in einer eigenen Zeile steht. Wenn ich das jetzt im Terminal teste, sieht die Ausgabe für den zweiten Fall so aus:

video@NAUTH:~$ echo "name_of_the_value=xxx" | sed "s/name_of_the_value=.*/name_of_the_value=$USER/"
name_of_the_value=video

Natürlich müssen Sie die Ausgabe zurück in die Datei leiten oder eine temporäre Datei zum Auslagern verwenden. Sie könnten Folgendes verwenden:

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file | sponge /input_file

Sed ändert die Ausgabe nur beim Lesen der Datei, nicht beim Schreiben. Sponge speichert die Ausgabe dann bis Sie fertig sind und schreibt die Änderungen zurück.

Wenn Sie Sponge nicht verwenden möchten oder können, schreiben Sie es in eine zweite Datei und wechseln Sie dann wie in dieser Befehlskette.

sed "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file > /output_file
rm -v /input_file
mv -v /output_file /input_file

Wie @kos im Kommentar angemerkt hat, können Sie auch das -iFlag des sedBefehls verwenden, um ohne Verwendung einer temporären Datei in die Eingabedatei zurückzuschreiben, oder sponge:

sed -i "s/name_of_the_value=.*/name_of_the_value=$new_value/" /input_file

verwandte Informationen