Androidシェルでsedを使用する

Androidシェルでsedを使用する

私はAndroid端末エミュレーションのsedに慣れてきました。私が使用しているバージョンは、sedルート化されていないSonyデバイスにインストールされたおもちゃボックスに含まれています。sed --version(またはToysbox sed --version)は同じ結果を提供します。

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

今私はtoybox sedの特定のマニュアルを読んで、いくつかの簡単な1行のコードを試しました(手動で始めることができるスクリプトにこれらの行を含めることはアイデアです)。私が最初に気づいたのは、スクリプトを単純な角かっこ(例えば、sed -e 's / foo / bar / 'ファイル)で囲みようとすると正しく解釈されないことです。

コマンドは二重括弧を使用して機能しますが、スクリプトの解釈方法に問題があります(または間違っている可能性があります)。はい。ファイルの単語を置き換えようとしています。ファイルは「stringa di prova」に変換したい文字列「stringa di test」です。その結果、文字列は変更されますが、前の文字列が行の残りの部分に追加されます。

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が付属しています。以下は、問題が議論されたToy Boxメーリングリスト(悲しいことに逃した)へのリンクです。

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

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

残念ながら、現在のバージョンのトイボックスと今後のAndroidのアップデートを待つ必要があります。

関連情報