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

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

Я хотел заменить первый экземпляр </verse-sub-section> </section> в файле здесь:

  • Найдите номер строки, который содержит шаблон, используя специальный разделитель регулярных выражений
  • Сценарий для извлечения выбранных записей из файла bibtex
  • Добавить строку в список, используя AWK или SED?
  • Regex: нужна помощь с использованием awk и sed для соответствия веб-сайтам по IP-адресу
  • Как извлечь текст с помощью sed
  • sed + добавить последнее слово для каждой строки, только если слово не отображается
  •   <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

  • удалить строки в файле csv старше 7 дней
  • Вставьте строку после блока текста с помощью sed
  • Как grep заголовок в man-странице, содержащей управляющие символы
  • Почему sed не использует расширенный режим регулярного выражения по умолчанию?
  • sed регулярное выражение ведет себя иначе, чем в vim и perl?
  • Сопоставьте текущую строку до строки, которая не соответствует шаблону
  • 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 - лучшая ОС в мире.