Androidで「g」修飾子なしで「sed」を使用しますか?

Androidで「g」修飾子なしで「sed」を使用しますか?

ルート化されたNexus 10にStericsonビジボックスをインストールしました。

</verse-sub-section>ファイルの最初のインスタンスを次に置き換えたいと思います</section>

          <section>Psalm of David</verse-sub-section>
          <verse-sub-section>David Weeps</verse-sub-section>

sed -i 's#</verse-sub-section>#</section>#' file最後に修飾語を使用しなくても、すべてが置き換えられます</verse-sub-section></section>g

ビジーボックスのせいですか?それとも私の命令が間違っていますか?これを達成するには、何を使用する必要がありますか?

ビジボックスバージョン:1.23.1

答え1

最初に一致するインスタンスまでファイルの一部に置き換えを制限するには、置換コマンドの前に次を追加します。範囲1,\#pattern#

busybox sed '1,\#</verse-sub-section># s#</verse-sub-section>#</section>#' file

\#コマンドにバックスラッシュエスケープが含まれていない限り、代替区切り記号の前にバックスラッシュエスケープを使用することに注意してくださいs

最初の行で一致する項目が発生すると、目的の動作は生成されません。 GNU sedはこのケースを処理するためのさまざまなフォーマットをサポートしています0,\#pattern#が、busybox sed(少なくとも私がテストできたバージョンBusyBox v1.22.1 (Ubuntu 1:1.22.0-8ubuntu1))はサポートしていないようです。それ。

答え2

あなたの質問はあいまいです。探したい場合最初の例</verse-sub-section> ファイル全体にをに変更して</section>他の回答を確認してください。私の解釈は、入力が与えられたものです。

1    <section>Genesis</verse-sub-section>
2    <verse-sub-section>In the beginning, God ...</verse-sub-section>
3    <section>Psalm of David</verse-sub-section>
4    <verse-sub-section>David Weeps</verse-sub-section>

行1と3を</verse-sub-section>変更しようとしています。</section>これがあなたの質問なら、答えは次のようになります。

sed -i 's#\(<section>.*\)</verse-sub-section>#\1</section>#' file

<section>置く古いコマンドフィールドは、含まれている行のみを処理するように保証されています。行の一部を区切ります。つまり、 から始まるまで(含まない)部分です。そしてs/old/new/<section>\(…\)<section></verse-sub-section>\1新しいフィールドは、一致する文字列の認識された部分文字列がファイルに再挿入されるようにします。つまり、変更されていないままです。

少なくともそれが* nixの基本バージョンで動作する方法です。 Androidも変わりませんが、busyboxで動作することを保証することはできません。

関連情報