Ich mache mich mit sed auf der Android-Terminalemulation vertraut: Die von mir verwendete Version ist sed
in der Toybox enthalten, die auf meinem nicht gerooteten Sony-Gerät installiert ist. sed --version
(oder toybox sed --version) gibt dasselbe Ergebnis aus:
Dies ist nicht GNU sed 9.00
Nun habe ich das entsprechende Handbuch von Toybox sed gelesen und einige einfache Einzeiler ausprobiert (die Idee ist, diese in Skripte einzuschließen, die ich manuell starten kann). Das Erste, was mir aufgefallen ist, ist, dass es nicht richtig interpretiert wird, wenn ich versuche, das Skript in einfache Klammern einzuschließen (es sed -e 's/foo/bar/' file).
Der Befehl funktioniert mit den doppelten Klammern, aber ich habe Probleme mit der Art und Weise, wie Skripte interpretiert werden (oder vielleicht mache ich etwas falsch). Beispiel. Ich versuche, ein Wort in einer Datei zu ersetzen. Die Datei ist eine Zeichenfolge „stringa di test“, die ich in „stringa di prova“ umwandeln möchte. Das Ergebnis ist, dass die Zeichenfolge ersetzt wird, aber die vorherige Zeichenfolge an den Rest der Zeile angehängt wird:
user:$ ls
file.txt
n.sh
s.sh
save
script_gian.sh
sed_script
user: $ cat file.txt
stringa di test
user:$sed -i -e "s/test/prova/g" file.txt <
^C1|user:$ cat file.txt
stringa di test
user:$ sed -r -e "s/test/prova/1" file.txt > f.txt <
user:$ ls
f.txt
file.txt
file.txtFD4OVI
n.sh
s.sh
save
script_gian.sh
sed_script
user:$ cat f.txt
stringa di provastringa di test
user:$ cat file.txt
stringa di test
user: $
Interessant ist auch, dass der Versuch, das Flag g (global) zu verwenden, dazu führt, dass sed hängen bleibt und mit STRG+C unterbrochen werden muss. Auch der Befehl -i führt dazu, dass sed hängen bleibt.
Ich habe auch versucht, einen String mit der Pipe an sed weiterzuleiten:
cat file.txt | sed -e "s/foo/bar/" > newfile.txt
Aber das Ergebnis ist genau dasselbe. Das Wort in der Zeichenfolge wird ersetzt und die Zeile, wie sie vor der Ersetzung war, wird direkt danach angehängt (dadurch werden auch die restlichen Zeichen in der Zeile gelöscht). Benutze ich es sed
falsch oder stimmt etwas mit der Version von sed
nicht, die ich verwenden möchte?
Antwort1
Ich konnte mir bestätigen lassen (dank des #toybox-IRC-Kanals), dass das Problem tatsächlich ein Fehler in Toybox sed war, der eigentlich behoben sein sollte, aber Android M wird immer noch mit einer veralteten Version von Toybox ausgeliefert. Dies sind die Links zur Toybox-Mailingliste (die ich leider übersehen hatte), in der die Probleme besprochen wurden:
http://lists.landley.net/pipermail/toybox-landley.net/2016-January/007897.html
http://lists.landley.net/pipermail/toybox-landley.net/2015-September/004415.html
Schade, ich muss auf eine aktuelle Version von Toybox mit einem zukünftigen Android-Update warten.