Использование `sed` в Android без модификатора` g`?

У меня есть загрузочный ящик Stericson, установленный в моем укорененном Nexus 10.

Я хотел заменить первый экземпляр </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 в конце.

Это из-за busybox? Или моя команда ошибается? Что я должен использовать для достижения этого (в андроиде с busybox)?

Версия для Busybox: 1.23.1

  • Может ли строка «abcedf» соответствовать строке «bafcde» в одной строке?
  • Избавиться от десятичного разряда и отменить запятую
  • Дата изменения «29 июля 2011 года» на «20110729»
  • Замените все, кроме прописных букв, первым параметром (с sed)
  • Как эффективно разделить большой текстовый файл без разделения многострочных записей?
  • Как удалить дубликаты из выходных данных tshark
  • как разделить файл и строки
  • Sed удалить строку, если n-й символ не является конкретным символом
  • 2 Solutions collect form web for “Использование `sed` в Android без модификатора` g`?”

    Чтобы ограничить замену части файла до и включая первый соответствующий экземпляр, вы можете добавить команду substitute в диапазон формы 1,\#pattern# ie

     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) – не по-видимому.

    Ваш вопрос неоднозначен. Если вы хотите найти самый первый экземпляр </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> 

    вы хотите заменить </verse-sub-section> на </section> на строках 1 и 3. Если это ваш вопрос, ответ будет

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

    Помещение <section> в старое поле команды s/ old / new / гарантирует, что будут обрабатываться только строки, содержащие <section> . \(…\) ограничивает часть строки: часть, начинающаяся с <section> и идет вверх (но не включает) </verse-sub-section> . И \1 в новом поле заставляет идентифицированную подстроку совпадающей строки вставлять обратно в файл, т. Е. Оставаться нетронутой.

    По крайней мере, так оно и работает в обычных версиях * nix. Android не должен быть другим, но я не могу гарантировать, что он будет работать в busybox.

    Linux и Unix - лучшая ОС в мире.