Android シェルからの sed の使用

Android シェルからの sed の使用

私は Android ターミナル エミュレーションの sed に慣れつつあります。私が使用しているバージョンは、sedルート化されていない Sony デバイスにインストールされている toybox に含まれています。sed --version(または toybox sed --version) を実行すると、同じ結果が得られます。

これはGNU sed 9.00ではありません

さて、toybox sed の特定のマニュアルを読んで、いくつかの簡単なワンライナーを試しました (アイデアは、手動で起動できるスクリプトにそれらを含めることです)。ここで最初に気付いたのは、スクリプトを単純な括弧で囲んで含めようとすると (es sed -e 's/foo/bar/' ファイル)、正しく解釈されないことです。

このコマンドは二重括弧を使用しても機能しますが、スクリプトの解釈方法に問題があります (または、私が間違っている可能性があります)。例: ファイル内の単語を置換しようとしています。ファイルは文字列 "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: $

もう 1 つの興味深い点は、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 が付属していることが確認できました。問題が議論されていた toybox メーリング リストへのリンクは次のとおりです (残念ながら、見逃していました)。

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

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

残念ですが、今後の Android アップデートで toybox の最新バージョンがリリースされるまで待たなければなりません。

関連情報