Regex `/ pattern / g` и ed`: g / pattern / `: что было первым, и почему` g`?

Опция g (например, s/pattern/replacement/g ) для многих инструментов, которые используют сопоставление шаблонов в стиле regex, и команда :g в ed , ex , vi и vim имеют довольно сходное использование и значение: соответствие данному регулярному выражению «глобально» ", т. е. не останавливаться после первого матча.

У меня есть два вопроса:

  • Что на первом месте, команда :g или флаг соответствия шаблону g , и в каком инструменте? Похоже, что большинство инструментов (таких как sed ), которые используют флаг g в их сопоставлении с образцом, действительно прямо или косвенно имитируются. Например, в post-Perl-возрасте большинство инструментов, которые используют регулярное выражение, допускают флаг g потому что Perl делает, и Perl, как представляется, делает это, потому что ed -> sed -> Perl . Поэтому я не удивлюсь, если ответ будет «они были введены одновременно в оригинальном ed и не имеют исторического прецедента».
  • Почему это называется global вариантом (или командой)? В этом нет ничего «глобального»; Команда :g принимает ряд строк, как и любую другую команду ed , и флаг g не расширяет диапазон поиска каким-либо образом (он просто допускает множественные удары). Полагаю, я не могу придумать лучшего имени, но выбранный мне кажется странным, поэтому мне интересно, есть ли какая-то причина для этого, я не вижу.

  • Удалить возврат каретки с помощью sed
  • Есть ли способ фильтрации и печати определенного шаблона без повторения кода?
  • Получите строку и поместите ее в начале строки, пока не будет найдена следующая строка
  • Есть ли разница между read, head -1 и sed 1q?
  • Чтение строки переменного размера и разбиение ее содержимого на отдельные строки с текстом
  • Используйте SED или AWK для перемещения строк по столбцам
  • Выделите сегодня в Mac
  • Цифры с нулевым заполнением до 2 цифр с помощью sed
  • 2 Solutions collect form web for “Regex `/ pattern / g` и ed`: g / pattern / `: что было первым, и почему` g`?”

    Я считаю, что они оба пришли в то же время, что и часть ed , или, возможно, QED . Они довольно фундаментальны для использования ed . Если бы была когда-либо версия, в которой не было обоих, я не могу представить, как она будет функционировать.

    g// и //g – две совершенно разные вещи. И на самом деле здесь происходит несколько вещей.

    • // для поиска следующей строки в файле, который содержит шаблон, он может возвращать только одну строку (обратите внимание, что 1,$/./ недействителен).
    • g// предназначен для поиска шаблона на нескольких строках, по умолчанию всего или заданного диапазона. Он может возвращать несколько строк.
    • //g само по себе бессмысленна и не является допустимой командой в ed (хотя некоторые другие ее принимают, она функционально совпадает с // любом случае).
    • s// является заменой первого экземпляра шаблона на текущую (или указанную) строку (строки).
    • s//g – для замены всех экземпляров шаблона на текущей (или указанной) строке (строках).

    Надеюсь, что это хоть немного облегчит путаницу. Но я думаю, что основной вопрос ответа на ваш вопрос в том, что это две разные вещи. Каждый из них используется по другой причине и означает разные вещи.

    vi вдохновлен ex , ex вдохновлен ed , ed вдохновлен qed

    ed был взломан Ken Thompson еще в 1971 году – в основном он поставил регулярное выражение в qed (он сделал намного больше, чем это, но это выходит за рамки этого ответа).

    Одна команда в ed была командой «g» или «global». Это позволило вам работать со всеми строками в файле сразу.

    Grep на самом деле назван для одного из видов использования этой команды g / re / p ( g global, re regular expression, p print) в ed эта команда использовалась как g/bash/p для печати всех строк, содержащих слово bash – это было снято с производства и сделано в автономную функцию (по словам Дуга Макилроя, он попросил Кена сделать это за него, а Кен оставил его на своем столе на следующее утро)

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