Скопіюйте довгий однорядковий текст із терміналу із небажаною лінією змін


14

locate ... | less виводить довгий шлях, який відображається у терміналі декількома рядками, хоча насправді це один рядок.

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

Але я пам'ятаю, що іноді я можу скопіювати довгий вихідний шлях locate ... | less, не вводячи небажаних змін рядків, а іноді не можу. Я не усвідомлюю, чи роблю щось інакше.

Тож мені цікаво, як переконатися, що проблеми не відбудеться? Дякую!

Моя ОС: Ubuntu 12.04.

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



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

Тож ваш Q детальніше про те, чому або як контролювати таку поведінку?
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режимами, тому, можливо, це теж погіршує.
Dan Gravell

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

2

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

Якщо натиснути, PgUpто скопіюйте один і той же текст, він вийде у вигляді декількох рядків.

PgDnдобре, стрілки - добре. Але PgUpзмушує текст розщеплюватися.


Це не зовсім справжня причина поведінки. Дивіться мою відповідь: unix.stackexchange.com/a/445590/105308
bobbel

0

Якщо мета - копіювати та вставляти, я використовую catзамість lessабо, moreа потім термінал захоплює його як насправді, а не як відображається.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.