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 xxx
Wert 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:
- 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=xxx
und ersetzen durchname_of_the_value=user_value
- Ersetzen Sie nur den
xxx
(Wert-)Teil - 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
, sed
wenn awk
ich 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_value
Teil 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 -i
Flag des sed
Befehls 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