Почему мы можем заменить строки sed, добавив "g"?

Вопрос:

Если вы хотите заменить "abc" на "ABC" после строки, вы будете писать

sed -e "s/abc/ABC/" <file name> #code1

И если вы хотите заменить их на бесконечное время на строку, вы напишете

sed -e "s/abc/ABC/g" <file name> #code2

Что это означает? Я считаю, что code1 ведет себя так, как показано ниже.

  1. Первая строка файла копируется в пространство шаблонов.
  2. "abc" в строках в пространстве шаблонов заменяется на "ABC".
  3. Отображаются замененные строки в пространстве шаблонов.
  4. Следующая строка файла копируется в пространство шаблонов, а process2 и process3 повторяются.

По словам man sed, команда «g» означает «Копировать пространство удержания в пространство рисунка».

Теперь возникает вопрос. Не удерживается ли пустое пространство, если вы не скопируете содержимое пространства шаблонов? Я понимаю 'g' копии 'g' содержат пространство в пространстве шаблонов, но я думаю, что пространство для хранения всегда пустое. Скорее, я думаю, вы должны написать, как

sed -e "hs/abc/ABC/g" <file name> #code3

где 'h' означает "Copy pattern space to hold space", по словам man sed.

Я вообще не понимаю поведения пространства удержания. Может ли кто-нибудь мне помочь?

Лучший ответ:

Глобальный модификатор

В этом контексте g в конце шаблона является флагом или модификатором для предыдущего выражения и прагматически означает «глобальная замена (в текущем пространстве шаблонов)».

Более формально, в BSD sed (1) флаг говорит:

g       Make the substitution for all non-overlapping
        matches of the regular expression, not just the
        first one.

Например:

# Replace only the first match.
$ echo 12345 | sed 's/[[:digit:]]/0/'
02345

# Replace all matches in the pattern, e.g. [g]lobal replacement.
$ echo 12345 | sed 's/[[:digit:]]/0/g'
00000

Конечно, есть другие способы получить этот результат с помощью этого довольно надуманного примера, но дело в том, что g-модификатор означает «глобальный» в текущем шаблоне.

Модификаторы/флаги против команд

Использование флага подстановки контрастирует с командами g или G, которые копируют или добавляют пространство удержания в пространство шаблона. Несмотря на то, что флаг и команда могут выглядеть схожими, они обычно используются в разных контекстах и имеют совершенно другое поведение. Сначала это может показаться запутанным, но команды напрямую не связаны с (и не изменяют) выражениями замещения, которые могут помочь вам рассказать им обособленно.

Оцените статью
TechArks.Ru
Добавить комментарий