Использование `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 удалить поле, только если числовое
  • Увеличьте число, используя ssh
  • Распечатайте строку в stdout, которая соответствует выражению, если вывод содержит другое выражение
  • Как я могу извлечь данные из этой строки?
  • Команда SED - char 4: unterminated `s '
  • Понимание выражения sed
  • Печать регулярного выражения Sed в файл .txt
  • Использование 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

    Добавить столбец в интерфейс диспетчера архива

    Печать только git commit sha и шаблон с помощью sed

    проверьте, соответствует ли строка допустимому пути в BASH

    Выражение Egrep как выражение grep

    Сохраняйте вывод arp в терминале в текстовый файл каждую минуту, используя crontab

    Как заставить мой debian работать как прокси-сервер http / html?

    Получение «cpio: Плохая магия» при попытке установить rpm в установленный логический том

    Ограничение общего размера vfs_recycle samba путем обрезания самых старых удаленных файлов

    Почему более новые версии awk печатают большие целые числа вместо десятичных знаков?

    Мультимедийные клавиши (Fn + ) больше не работают после обновления

    Обеспечение безопасности NFS в многопользовательской среде

    Некоторые клавиши недействительны на emacs при использовании немецкой клавиатуры

    Разбор CSV с использованием AWK или SED

    Получение текущего использования памяти сеанса tmux

    Как автоматически установить на исполняемый бит для определенного файла

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