Старый буфер h
подходит для хранения строки (или группы строк) до более позднего тестирования оказывается правдой. Другими словами, он хорош для обработки последовательностей данных, которые вы хотите быть последовательными, но не еще последовательными - потому что это позволяет вам склеивать их вместе. Но для этого также требуется много копий между двумя буферами. Это не так уж плохо, если вы создаете серию строк с помощью старых команд H
- просто добавляя - но каждый раз, когда вы x
меняете буферы, вы копируете их целиком к другому и наоборот.
Когда вы работаете с серией строк, которые уже являются последовательными, и хотите обрезать их в зависимости от контекста, то лучше всего
смотреть- вперед - в отличие от вида старого буфера h
- позади . cuonglm делает это уже для второй половины своего ответа, но вы можете использовать эту логику для любой формы.
sed '$!N;/\nage.*: 10/P;D' outfile
Смотрите, это добавит строку ввода N
ext после встроенного разделителя \ n
ewline к текущему пространству шаблонов на каждой строке, которая равна !
, а не последний $
.Затем он проверяет, соответствует ли только что вытянутая строка шаблону, и, если да, то P
ринит только до первой \ n
строки в пространстве шаблонов - то есть только до предыдущей строки. Наконец, он D
выбирает первую \ n
строку в пространстве шаблонов и снова запускает цикл. Таким образом, на протяжении всего файла вы сохраняете однострочный просмотр - вперед без ненужной замены буферов.
Если я немного изменю команду, вы сможете увидеть, как она работает, - проведя пальцем по файлу с двухстрочным окном. Я добавлю команду l
ook непосредственно перед D
:
sed '$!N;/\nage.*: 10/P;l;D'
Name is : sara
Name is : sara\nage is : 10$
age is : 10\nName is : john$
Name is : john\nage is : 20$
age is : 20\nName is : Ron$
Name is : Ron
Name is : Ron\nage is : 10$
age is : 10\nName is : peggy$
Name is : peggy\nage is : 30$
age is : 30$
Это ее результат. Строки, заканчивающиеся на $
, являются результатом команды l
ook, которая отображает экранированную версию пространства шаблонов в стандартный вывод. Строки, которые не заканчиваются на $
, - это те строки, которые в противном случае были бы закрашены P
. Как вы можете видеть, предыдущая строка рисуется только P
, когда вторая строка в пространстве шаблонов - строка N
ext только что вставлена и следует за \ n
ewline в пространстве шаблонов - соответствует вашему шаблону.
Помимо уже предложенных вам решений, вы можете использовать другой способ печати только строк Name , предшествующих строке age , которая не не заканчивается на 10:
sed -n '/^Name/N;/ 10$/!s/\nage.*//p'
...который добавляет только строку \ n
ewline, за которой следует строка ввода N
ext, если пространство шаблонов начинается со строки Name , и только p
выводит строку, если пространство шаблонов не заканчивается строкой 10 и , если sed
может успешно s ///
убрать ] \ n
ewline, за которым следует строка age и все, что следует до конца пространства шаблонов.Поскольку в пространстве шаблонов не может быть строки \ n
ewline, кроме как в результате команды редактирования, такой как N
ext, - это гарантирует, что только строки Name напечатаны те, которые непосредственно предшествуют строке age , которая не оканчивается строкой 10 .
Весь синтаксис, использованный в приведенном выше ответе, является стандартом POSIX - он должен работать так, как написано с любым sed
, поддерживающим этот стандарт.
Оболочка — это просто приложение, работающее в терминале. Для вставки актуальны только эмуляторы , но есть еще "настоящие" терминалы (подсказка :консоль линукса не одна из тех ).
Не принимая во внимание различные реализации консоли, поскольку вставка текста осуществляется более ограниченным образом, терминалы, работающие в X, являются предметом вопроса. Эмулятор терминала просто видит серию событий . Набранные клавиши или вставленный текст выглядят одинаково для эмулятора терминала.
Принимая во внимание только эмуляторы терминала (и выбор/вставку между ними ), возврат назад не является проблемой, поскольку выбор/вставка работают с тем, что отображается в окне терминала. То есть, если пользователь выбирает текст в окне терминала, только печатный текст (с возможными символами табуляции в качестве особого случая ). Нет никаких символов возврата (, если только у кого-то не работает реализация терминала ), потому что возврат указывает терминалу переместить курсор влево . Не осталось печатной информации, которую терминал мог бы предоставить при выборе. Существуют сотни других элементов управления терминалом, которые можно использовать , но возврат назад прост и широко используется.
Backspace — это проблема с плохо реализованными приложениями, такими как браузеры (, которые действительно должны отображать печатный текст... ), который, по-видимому, будет хранить то, что какой-то автор сценария -решит сохранить на экране..
Итак... вместо того, чтобы спрашивать , почему эмуляторы терминалов до сих пор допускают BS , можно было бы спросить, почему браузеры с графическим интерфейсом допускают такое поведение.