Почему Linux разрешить возврат при вставке текста в оболочку?

Старый буфер 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 , поддерживающим этот стандарт.

3
20.03.2018, 21:09
1 ответ

Оболочка — это просто приложение, работающее в терминале. Для вставки актуальны только эмуляторы , но есть еще "настоящие" терминалы (подсказка :консоль линукса не одна из тех ).

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

Принимая во внимание только эмуляторы терминала (и выбор/вставку между ними ), возврат назад не является проблемой, поскольку выбор/вставка работают с тем, что отображается в окне терминала. То есть, если пользователь выбирает текст в окне терминала, только печатный текст (с возможными символами табуляции в качестве особого случая ). Нет никаких символов возврата (, если только у кого-то не работает реализация терминала ), потому что возврат указывает терминалу переместить курсор влево . Не осталось печатной информации, которую терминал мог бы предоставить при выборе. Существуют сотни других элементов управления терминалом, которые можно использовать , но возврат назад прост и широко используется.

Backspace — это проблема с плохо реализованными приложениями, такими как браузеры (, которые действительно должны отображать печатный текст... ), который, по-видимому, будет хранить то, что какой-то автор сценария -решит сохранить на экране..

Итак... вместо того, чтобы спрашивать , почему эмуляторы терминалов до сих пор допускают BS , можно было бы спросить, почему браузеры с графическим интерфейсом допускают такое поведение.

8
27.01.2020, 21:11

Теги

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