Skopiuj długi jednowierszowy tekst z terminala z niepożądaną linią zmiany


14

locate ... | less wyprowadza długą ścieżkę, która jest pokazana jako kilka linii w terminalu, chociaż w rzeczywistości jest to jedna linia.

Kopiuję ścieżkę z terminala, zaznaczając tekst myszką i naciskając Ctrl+ Shift+ C. Kiedy wklejam go do pliku tekstowego, pojawia się niechciana linia zmian w tekście, dokładnie w taki sam sposób, jak pokazano w terminalu.

Ale czasami pamiętam, że mogę skopiować wyjście długiej ścieżki locate ... | lessbez wprowadzania niepożądanych zmian linii, a czasem nie mogę. Nie wiem, czy zrobię coś inaczej.

Zastanawiam się więc, jak się upewnić, że problem się nie wydarzy? Dzięki!

Mój system operacyjny: Ubuntu 12.04.

Mój terminal: Gnome Terminal 3.4.1.1



Ale Ctrl + Shift + C może kiedyś skopiować długą linię bez kopiowania linii zmian. Myślę, że wciąż różne problemy.
Tim

Więc twoje pytanie dotyczy bardziej, dlaczego lub jak kontrolować to zachowanie?
slm

Tak. Kopiuję tekst z terminala za pomocą klawisza skrótu (który, jak sądzę, jest najszybszy), nie przekierowując wyniku do pliku
Tim

Czy jest coś jeszcze o tym, że zachowanie jest jednokierunkowe w porównaniu do drugiego?
slm

Odpowiedzi:


3

Zamiast kopiować to, co jest wyświetlane na terminalu (tylko to, co mieści się na ekranie, z), skopiuj tekst. Użyj jednego z zewnętrznych narzędzi xsel lub xclip (mają one w większości te same funkcje, użyję xsel w tej odpowiedzi), aby skopiować dane ze lub do schowka X. Aby skopiować do schowka, przekaż żądaną treść na standardowym wejściu. Podczas wklejania ze schowka zawartość jest zapisywana na standardowe wyjście.

W mniejszym stopniu użyj |polecenia, aby poprowadzić wiązkę linii przez polecenie. Przewiń do pierwszego wiersza, na którym chcesz działać, wpisz, mmaby ustawić znak, przewiń do ostatniego wiersza, a następnie wpisz |mxsel -bi naciśnij Enter. Predefiniowane są dwa znaczniki: ^na początku pliku, $na końcu pliku. Aby skopiować cały plik, użyj <|$xsel -b. Aby skopiować pojedynczy wiersz, użyj mm|mxsel -bi Enter.

Usuń -bopcję kopiowania do podstawowego wyboru zamiast schowka.


3

Rzeczywiste zachowanie tego jest następujące:

jeśli jesteś w lessśrodku i masz plik z bardzo długą linią, to jeśli przewiniesz długą linię w dół i przewiniesz w górę, masz wiele linii podczas kopiowania całego tekstu. Następnie, gdy przewiniesz podzielone linie w dolnej części terminala i przewiniesz linie ponownie, podział linii zostanie ponownie usunięty.

Do wizualizacji:

wprowadź opis zdjęcia tutaj


2

Możesz skopiować linie wyjściowe bez dodatkowych znaków nowej linii ( podziałów linii), jeśli tekst był wyprowadzany bezpośrednio do terminala.
Terminal może śledzić, gdzie znajdują się rzeczywiste końce linii.

Ale jeśli linie zostały wyprowadzone przez lesslub podobny pagerprogram, terminal nie wie, gdzie są nowe linie. Pager używa terminala jako pełnego ekranu znaków i mówi terminalowi „umieść tam te znaki” oraz operacje takie jak przewijanie. Ale w terminalu nie ma sposobu, aby zobaczyć, gdzie są przeznaczone nowe linie.


2
Odkryłem, że czasami kopiuję podziały linii, a czasem nie. Jest to niespójne w czasie. Dzisiaj oba miały miejsce, gdy I Ctrl-shift-c z locate <something> | lessw dwóch różnych przypadkach.
Tim

Mniej rysuje sam ekran, normalnie, aby terminal nie widział, gdzie kończą się linie. Ale mniej można skonfigurować, tak naprawdę nie rób nic dla krótkich plików pasujących do wysokości ekranu. Możliwe więc, że różnica między przypadkami była taka, że ​​mniej było w innym trybie. (spójrz echo $LESS, może są ciekawe opcje za mniej.)
Volker Siegel

@ Tim też mnie od lat wkurza. Może odpowiedź @ niknah sugeruje przyczynę? Często przełączam się między -Strybami, więc może to też pogorszy sytuację.
Dan Gravell

1
@Tim: Odkryłem coś, co może być lub nie być prawdziwe w twoim systemie operacyjnym i mniejszej wersji: zachowanie kopii różni się w zależności od tego, jak dotarłem do linii docelowej w mniejszym stopniu. Jeśli szukam do przodu, kopia nie zawiera zawijających znaków nowej linii (tzn. Kopiuje oryginalną treść długiej linii). Jeśli jednak przeszukałem plik do tyłu, aby dostać się do linii docelowej, wówczas kopia zawiera nowe linie i dzieli długą linię na wiele oddzielnych linii. Dla mnie wydaje się spójny na Macu i Linuksie.
erik.weathers

2

W lessprzypadku zaznaczenia owiniętego wielu wierszy tekstu, a następnie skopiowania go, zostanie on zapisany jako jeden wiersz.

Jeśli naciśniesz, PgUpa następnie skopiujesz ten sam tekst, pojawi się on jako wiele wierszy.

PgDnjest w porządku, strzały są w porządku. Ale PgUppowoduje podział tekstu.


To nie jest prawdziwa przyczyna tego zachowania. Zobacz moją odpowiedź: unix.stackexchange.com/a/445590/105308
bobbel

0

Jeśli celem jest kopiowanie i wklejanie, używam catzamiast lesslub, morea następnie terminal przechwytuje go tak, jak jest w rzeczywistości, a nie jak jest wyświetlany.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.