Я использую GNU sed 4.5, на sed --version
.
Я плохо знаком с sed, и я создал ниже рабочего процесса sed на основе моего понимания (исправьте меня при нахождении чего-то не так).
Таким образом, кажется, что автоматическая печать по умолчанию пространства шаблона будет всегда включать новую строку в конец. Мой вопрос, будет 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
печатает новую строку. Мне кажется, что это - непоследовательное поведение. Кто-либо может помочь объяснить?
В схеме существует ошибка. Добавляет назад, что новая строка для копирования пространства только происходит, когда sed выполняется без -n
опция. Таким образом, корректная схема должна быть:
Ниже выборка из документации sed в Как Работы sed
Когда конец сценария достигнут, если
-n
опция используется, содержание пространства шаблона распечатывается к потоку вывода, добавляя назад запаздывающую новую строку, если это было удалено. Затем следующий цикл запускается для следующей входной строки.
Таким образом, если мы выполняем sed с -n
, будет, не Добавляет, что новая строка назад ступает.
документация sed указывает что p
управляйте просто печатает пространство шаблона. Посмотрите Часто используемые Команды для деталей.
p
Распечатайте пространство шаблона (к стандартному выводу). Эта команда обычно используется только в сочетании с-n параметром командной строки.
Но это кажется этим p
будет всегда добавлять новую строку в конце пространства шаблона (исправьте меня, если Вы думаете, что это неправильно).
На основе вышеупомянутых фактов позвольте, смотрят примеры.
# seq 3 | sed -rn 'p'
1
2
3
Процесс для этого примера:
1<newline>
, полоса <newline>
и помещенный 1
в пространстве шаблона.p
печать 1
и затем печать a <newline>
2<newline>
, полоса <newline>
и помещенный 2
в пространстве шаблона.p
печать 2
и затем печать a <newline>
3<newline>
, полоса <newline>
и помещенный 3
в пространстве шаблона.p
печать 3
и затем печать a <newline>
Для второго примера:
# seq 3 | sed -rn 'x;p;x;p'
1
2
3
Процесс:
1<newline>
, полоса <newline>
и помещенный 1
в пространстве шаблона.1
в хранении располагают с интервалами и помещенная пустая строка в пространстве шаблона.<newline>
.1
назад к пространству шаблона и вставленной пустой строке содержат пространство.1
и затем печать a <newline>
Таким образом, нет никакого несоответствия в этих примерах.
BTW, я все еще изучаю sed, и этот ответ основан на моем понимании. Исправьте меня при нахождении чего-то не так.Спасибо.