sed-Verwendung von der Android-Shell aus

sed-Verwendung von der Android-Shell aus

Ich mache mich mit sed auf der Android-Terminalemulation vertraut: Die von mir verwendete Version ist sedin 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 sedfalsch oder stimmt etwas mit der Version von sednicht, 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.

verwandte Informationen