从 android shell 中使用 sed

从 android shell 中使用 sed

我正在熟悉 Android 终端仿真上的 sed:我正在使用的版本sed包含在安装在我的未 root 索尼设备上的玩具盒中。sed --version(或 toybox sed --version)给出相同的结果:

这不是 GNU sed 9.00

现在,我阅读了 toybox sed 中的具体手册,并尝试了一些简单的单行代码(想法是将这些行代码包含在我可以手动启动的脚本中)。现在我注意到的第一件事是,如果我尝试将脚本包含在简单的括号中(es sed -e 's/foo/bar/' file),则不会正确解释。

该命令使用双括号工作,但我在解释脚本的方式上遇到问题(或者也许我做错了)。例子。我尝试替换文件中的单词。该文件是一个字符串“stringa di test”,我打算将其转换为“stringa di prova”。结果是该字符串被替换,但前一个字符串被附加到该行的其余部分:

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: $

另一个有趣的事情是,尝试使用 g 标志(全局)会导致 sed 挂起,并且必须使用 CONTROL C 中断。 -i 命令也会导致 sed 挂起。

我还尝试使用以下命令将字符串传输到 sed:

cat file.txt | sed -e "s/foo/bar/" > newfile.txt

但结果是完全一样的。字符串内的单词被替换,并且替换之前的行被附加在该行之后(这也会删除该行中的剩余字符)-我是否使用错误或我正在尝试的sed版本中存在某些内容sed使用?

答案1

我可以确认(感谢 #toybox irc 频道)该问题确实是 toybox sed 中的一个错误,本应已解决,但 Android M 仍然附带过时版本的 toybox。这些是玩具箱邮件列表的链接(可惜我错过了),其中讨论了问题:

http://lists.landley.net/pipermail/toybox-landley.net/2016-January/007897.html

http://lists.landley.net/pipermail/toybox-landley.net/2015-September/004415.html

太糟糕了,我将不得不等待当前版本的 toybox 以及未来的 Android 更新。

相关内容