Usando o 'sed' no Android sem o modificador 'g'?

1

Eu tenho a caixa de ocupação do Stericson instalada no meu Nexus 10 enraizado.

Eu queria substituir a primeira instância de </verse-sub-section> por </section> no arquivo aqui:

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

sed -i 's#</verse-sub-section>#</section>#' file substitui todos os </verse-sub-section> por </section> mesmo quando não uso o modificador g no final.

Isso é devido ao busybox? Ou o meu comando está errado? O que devo usar para conseguir isso (no anroid com busybox)?

Versão do Busybox: 1.23.1

    
por One Face 11.02.2015 / 03:52

2 respostas

1

Para limitar a substituição a uma parte do arquivo até e incluindo a primeira instância correspondente, você pode preceder o comando substituto com um intervalo do formulário 1,\#pattern# ie

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

Observe que o uso da barra invertida é evitado antes do delimitador alternativo \# , exceto onde é introduzido pelo comando s .

Observe que isso não terá o comportamento desejado se ocorrer uma correspondência na primeira linha; O GNU sed suporta um intervalo na forma 0,\#pattern# para lidar com essa situação, mas o busybox sed - pelo menos a versão que eu posso testar, BusyBox v1.22.1 (Ubuntu 1:1.22.0-8ubuntu1) - não parece.

    
por 11.02.2015 / 04:35
1

Sua pergunta é ambígua. Se você quiser encontrar a primeira instância de </verse-sub-section> no arquivo inteiro e substitua por </section> , então veja a (s) outra (s) resposta (s). Minha interpretação é que, dada a entrada

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>

você deseja substituir </verse-sub-section> por </section> nas linhas 1 e 3. Se essa é a sua pergunta, a resposta é

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

Colocar <section> no campo antigo do comando s/old/new/ garante que apenas linhas contendo <section> serão processadas. O \(…\) delimita uma parte da linha: a parte que começa com <section> e indo até (mas não incluindo) o </verse-sub-section> . E o no campo novo faz com que a substring identificada da string correspondida para ser inserido de volta no arquivo - ou seja, deixado intocado.

Pelo menos é assim que funciona nas versões normais do * nix. O Android não deve ser diferente, mas não posso garantir que funcionará no busybox.

    
por 11.02.2015 / 05:13

Tags