Использование `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

  • Организация трехмерных данных с помощью awk / sed / perl
  • Как получить только имя файла с помощью sed
  • Эквивалент grep для awk или sed
  • Добавление значения ко всем столбцам
  • Разбор C-стиля Многострочный комментарий
  • sed и удалить строку между двумя шаблонами
  • проверка данных в столбцах, когда данные или некоторые могут отсутствовать или присутствовать?
  • Найти, если какая-либо строка файла является подмножеством данных в другом файле
  • 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.

    Interesting Posts

    Ноутбук загружается непосредственно в Ubuntu, больше не доступен для доступа к BIOS или меню загрузки

    Ошибка Accent на OpenWrt 12.09?

    Как разрешить неавторизованные логины через ssh на FreeBSD?

    Переопределение сообщения по умолчанию PAM

    md5sum для каждого файла (с ll)

    Как установить mailman, когда ему нужна более старая версия Python?

    Как связаны модули ядра с версией ядра?

    regexp, который соответствует всем токенам независимо от порядка

    Список аудиофайлов с битовой скоростью в командной строке

    Сценарий оболочки для перемещения файлов, если определенный процент строк содержит определенную строку

    Является ли rsync самым быстрым и надежным способом проверки идентичности каталогов?

    Нет возможности создания нового файла в centos 7 gui

    Отфильтруйте повторяющиеся строки хвоста -f

    Почему POSIX оставил `$ (выражение)` в awk неуказанным?

    Как разделить порты в источнике на отдельные источники в PulseAudio?

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