Скопируйте длинный однострочный текст из терминала с нежелательной строкой изменений


14

locate ... | less выводит длинный путь, который отображается как несколько строк в терминале, хотя на самом деле это одна строка.

Я копирую путь из терминала, выделяя текст мышью и нажимая Ctrl+ Shift+ C. Когда я вставляю его в текстовый файл, я получаю нежелательную строку изменения в тексте, точно так же, как это отображается в терминале.

Но я помню, что иногда я могу скопировать длинный путь locate ... | less, не вводя нежелательного изменения строки, а иногда я не могу. Я не понимаю, делаю ли я что-то по-другому.

Поэтому мне интересно, как убедиться, что проблема не произойдет? Благодарность!

Моя ОС: Ubuntu 12.04.

Мой терминал: Терминал Gnome 3.4.1.1



Но Ctrl + Shift + C может иногда копировать длинную строку, не копируя строку изменения. Все еще разные проблемы, я думаю.
Тим

Итак, ваш вопрос больше о том, почему или как контролировать это поведение?
SLM

Да. Я копирую текст из терминала с помощью сочетания клавиш (который, я думаю, самый быстрый способ), а не путем направления вывода в файл
Тим

Есть ли что-то еще о том, когда поведение в одну сторону по сравнению с другим?
SLM

Ответы:


3

Вместо того, чтобы копировать то, что отображается на терминале (только то, что умещается на экране), скопируйте фактический текст. Используйте одну из внешних утилит xsel или xclip (они имеют в основном те же функции, я буду использовать xsel в этом ответе) для копирования данных в буфер обмена X или в него. Чтобы скопировать в буфер обмена, передайте желаемый контент на стандартный ввод. При вставке из буфера обмена содержимое записывается на стандартный вывод.

Меньше используйте |команду для передачи группы строк через команду. Выделите первую строку, по которой вы хотите действовать, введите, mmчтобы установить метку, выделите последнюю строку, введите |mxsel -bи нажмите Enter. Предопределены две метки: ^для начала файла, $для конца файла. Таким образом, чтобы скопировать весь файл, используйте <|$xsel -b. Чтобы скопировать одну строку, используйте mm|mxsel -bи Enter.

Удалите -bопцию, чтобы скопировать в основной выбор вместо буфера обмена.


3

Реальное поведение этого заключается в следующем:

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

Для визуализации:

введите описание изображения здесь


2

Вы можете скопировать строки вывода без дополнительных новых строк (разрывы строк), если текст выводился непосредственно на терминал.
Терминал может отслеживать, где заканчиваются реальные линии.

Но если строки были выведены lessили подобной pagerпрограммой, терминал не знает, где находятся новые строки. Пейджер использует терминал как полный экран символов и говорит терминалу «поместить эти символы туда» и выполнять такие операции, как прокрутка. Но для терминала нет возможности увидеть, где предназначены новые строки.


2
Я обнаружил, что иногда я копирую разрывы строк, а иногда нет. Это противоречиво во времени. Сегодня оба произошли, когда я нажал Ctrl-shift-c locate <something> | lessв двух разных случаях.
Тим

Меньше рисует сам свой экран, обычно, чтобы терминал не видел, где заканчиваются линии. Но меньше можно настроить, на самом деле ничего не делать для коротких файлов, соответствующих высоте экрана. Так что возможно, что разница между делами заключалась в том, что меньше было в другом режиме. (посмотрите echo $LESS, может быть, есть интересные варианты за меньшие деньги.)
Volker Siegel

@ Это тоже давало мне много лет. Может, ответ @ niknah подсказывает причину? Я часто переключаюсь между -Sрежимами, так что, может быть, это тоже ухудшает ситуацию.
Дэн Грэвелл

1
@Tim: Я обнаружил что-то, что может или не может быть правдой в вашей ОС и менее версии: поведение копирования варьируется в зависимости от того, как я достиг цели в меньшей степени. Если я ищу вперед, то копия не включает переносы новой строки (то есть копирует оригинальное содержимое длинной строки). Однако, если я искал файл в обратном направлении, чтобы добраться до целевой строки, то копия включает в себя новые строки и разбивает длинную строку на несколько отдельных строк. Кажется, согласованным для Mac и Linux для меня.
erik.weathers

2

В less, если вы выберите завернуты несколько строк текста , а затем скопировать его, он будет спуститься в одну линию.

Если вы нажмете и PgUpскопируете один и тот же текст, он будет записан в несколько строк.

PgDnв порядке, стрелки в порядке. Но PgUpвызывает разделение текста.


Это не совсем настоящая причина поведения. Смотрите мой ответ: unix.stackexchange.com/a/445590/105308
Боббель

0

Если цель состоит в том, чтобы скопировать и вставить, я использую catвместо lessили, moreа затем терминал захватывает его так, как оно есть на самом деле, а не так, как оно отображается.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.