Гну sed, команда p добавит новую строку при печати?

Я использую GNU sed 4.5, на sed --version.

Я плохо знаком с sed, и я создал ниже рабочего процесса sed на основе моего понимания (исправьте меня при нахождении чего-то не так).

workflow chart

Таким образом, кажется, что автоматическая печать по умолчанию пространства шаблона будет всегда включать новую строку в конец. Мой вопрос, будет p включать новую строку, также? Я имею ниже примеров.

# seq 3 | sed -rn 'p'
1
2
3

Здесь новая строка в конце каждого числа добавляется самим sed (см. схему, "добавляет назад новая строка для копирования пространства"). Таким образом, это кажется p не добавит новую строку. Однако посмотрите ниже примера.

# seq 3 | sed -rn 'x;p;x;p'

1

2

3

Здесь x обменное пространство шаблона с пространством хранения, которое приведет к пустому пространству шаблона. Теперь p относится к пространству шаблона (ничто в нем), ничего не должен печатать. Но на основе результата, это кажется здесь p печатает новую строку. Мне кажется, что это - непоследовательное поведение. Кто-либо может помочь объяснить?

1
задан 8 January 2019 в 20:35

1 ответ

В схеме существует ошибка. Добавляет назад, что новая строка для копирования пространства только происходит, когда sed выполняется без -n опция. Таким образом, корректная схема должна быть:

workflow chart

Ниже выборка из документации sed в Как Работы sed

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

Таким образом, если мы выполняем sed с -n, будет, не Добавляет, что новая строка назад ступает.

документация sed указывает что p управляйте просто печатает пространство шаблона. Посмотрите Часто используемые Команды для деталей.

p

Распечатайте пространство шаблона (к стандартному выводу). Эта команда обычно используется только в сочетании с-n параметром командной строки.

Но это кажется этим p будет всегда добавлять новую строку в конце пространства шаблона (исправьте меня, если Вы думаете, что это неправильно).

На основе вышеупомянутых фактов позвольте, смотрят примеры.

# seq 3 | sed -rn 'p'
1
2
3

Процесс для этого примера:

  1. Прочитайте текст 1<newline>, полоса <newline> и помещенный 1 в пространстве шаблона.
  2. p печать 1 и затем печать a <newline>
  3. Прочитайте текст 2<newline>, полоса <newline> и помещенный 2 в пространстве шаблона.
  4. p печать 2 и затем печать a <newline>
  5. Прочитайте текст 3<newline>, полоса <newline> и помещенный 3 в пространстве шаблона.
  6. p печать 3 и затем печать a <newline>

Для второго примера:

# seq 3 | sed -rn 'x;p;x;p'

1

2

3

Процесс:

  1. Прочитайте текст 1<newline>, полоса <newline> и помещенный 1 в пространстве шаблона.
  2. Поместить 1 в хранении располагают с интервалами и помещенная пустая строка в пространстве шаблона.
  3. Распечатайте пустую строку и затем распечатайте a <newline>.
  4. Поместить 1 назад к пространству шаблона и вставленной пустой строке содержат пространство.
  5. Печать 1 и затем печать a <newline>
  6. Повторите шаг 1~5 для других входных строк

Таким образом, нет никакого несоответствия в этих примерах.

BTW, я все еще изучаю sed, и этот ответ основан на моем понимании. Исправьте меня при нахождении чего-то не так.Спасибо.

1
ответ дан 7 December 2019 в 15:09

Другие вопросы по тегам:

Похожие вопросы: