Copiez un long texte sur une seule ligne à partir d'un terminal avec une ligne de changement indésirable

14

locate ... | less génère un long chemin, qui est représenté par plusieurs lignes dans le terminal, bien qu'il s'agisse en fait d'une seule ligne.

Je copie le chemin depuis le terminal en sélectionnant le texte avec la souris et en appuyant sur Ctrl+ Shift+ C. Lorsque je le colle dans un fichier texte, j'obtiens une ligne de changement indésirable dans le texte, exactement de la même manière qu'il est affiché dans le terminal.

Mais je me souviens que parfois je peux copier une sortie à long chemin par locate ... | less, sans introduire de changement de ligne indésirable, et parfois je ne peux pas. Je ne sais pas si je fais quelque chose différemment.

Je me demande donc comment s'assurer que le problème ne se produira pas? Merci!

Mon OS: Ubuntu 12.04.

Mon terminal: Gnome Terminal 3.4.1.1

Tim
la source
Mais Ctrl + Shift + C peut parfois copier une longue ligne sans copier la ligne de changement. Des problèmes toujours différents, je pense.
Tim
Donc, votre Q est plus sur pourquoi ou comment contrôler ce comportement?
slm
Oui. Je copie du texte hors du terminal à l'aide de la touche de raccourci (ce qui, je suppose, est le moyen le plus rapide), pas en dirigeant la sortie vers un fichier
Tim
Y a-t-il quelque chose de plus quand le comportement est à sens unique par rapport à l'autre?
slm

Réponses:

3

Au lieu de copier ce qui est affiché sur le terminal (uniquement ce qui tient à l'écran, avec), copiez le texte réel. Utilisez l'un des utilitaires externes xsel ou xclip (ils ont principalement les mêmes fonctionnalités, je vais utiliser xsel dans cette réponse) pour copier des données depuis ou vers le presse-papiers X. Pour copier dans le presse-papiers, passez le contenu souhaité sur l'entrée standard. Lors du collage à partir du presse-papiers, le contenu est écrit sur la sortie standard.

En moins, utilisez la |commande pour diriger un groupe de lignes via une commande. Faites défiler jusqu'à la première ligne sur laquelle vous souhaitez agir, tapez mmpour définir une marque, faites défiler jusqu'à la dernière ligne, saisissez |mxsel -bet appuyez sur Enter. Deux repères sont prédéfinis: ^pour le début du fichier, $pour la fin du fichier. Ainsi, pour copier tout le fichier, utilisez <|$xsel -b. Pour copier une seule ligne, utilisez mm|mxsel -bet Enter.

Supprimez l' -boption de copier dans la sélection principale au lieu du presse-papiers.

Gilles 'SO- arrête d'être méchant'
la source
3

Le comportement réel de ceci est le suivant:

si vous êtes dedans lesset que vous avez un fichier avec une très longue ligne, alors si vous faites défiler la longue ligne vers le bas et faites défiler vers le haut, vous avez plusieurs lignes, lors de la copie de tout le texte. Après cela, lorsque vous faites défiler les lignes fractionnées vers le bas sur le bas du terminal et faites à nouveau défiler les lignes, les sauts de ligne seront à nouveau supprimés.

Pour la visualisation:

entrez la description de l'image ici

bobbel
la source
2

Vous pouvez copier les lignes de sortie sans retour à la ligne supplémentaire ( saut de ligne) si le texte a été sorti directement sur le terminal.
Le terminal peut garder une trace de la fin de la ligne réelle.

Mais si les lignes ont été sorties par lessou un pagerprogramme similaire , le terminal ne sait pas où sont les sauts de ligne. Le téléavertisseur utilise le terminal comme un plein écran de caractères et indique au terminal de "mettre ces caractères là" et des opérations comme le défilement. Mais, pour le terminal, il n'y a aucun moyen de voir où les nouvelles lignes sont destinées.

Volker Siegel
la source
2
J'ai constaté que parfois je copie les sauts de ligne et parfois non. C'est incohérent dans le temps. Aujourd'hui, les deux se sont produits lorsque j'ai Ctrl-shift-c locate <something> | lessdans deux cas différents.
Tim
Moins dessine son écran lui-même, normalement, de sorte que le terminal ne voit pas où se terminent les lignes. Mais moins peut être configuré ne fait rien pour les fichiers courts correspondant à la hauteur de l'écran. Il est donc possible que la différence entre les cas soit que moins était dans un mode différent. (jetez un œil echo $LESS, il y a peut-être des options intéressantes pour moins.)
Volker Siegel
@Tim, ça me dérange aussi depuis des années. Peut-être que la réponse de @ niknah suggère la cause? Je change souvent de -Smode, alors peut-être que cela aggrave aussi.
Dan Gravell
1
@Tim: J'ai découvert quelque chose qui pourrait ou non être vrai sur votre version du système d'exploitation et moins: le comportement de la copie varie en fonction de la façon dont je suis arrivé à la ligne cible en moins. Si je cherche vers l'avant, la copie n'inclut pas les retours à la ligne enveloppants (c'est-à-dire qu'elle copie le contenu de la ligne longue d'origine). Cependant, si j'ai cherché en arrière dans le fichier pour atteindre la ligne cible, la copie inclut les nouvelles lignes et divise la longue ligne en plusieurs lignes distinctes. Semble cohérent sur Mac et Linux pour moi.
erik.weathers
2

Dans less, si vous sélectionnez plusieurs lignes de texte encapsulées, puis copiez-le, il apparaîtra sur une seule ligne.

Si vous appuyez sur PgUppuis copiez le même texte, il apparaîtra sur plusieurs lignes.

PgDnc'est bien, les flèches vont bien. Mais PgUpprovoque la division du texte.

niknah
la source
Ce n'est pas exactement la vraie cause du comportement. Voir ma réponse: unix.stackexchange.com/a/445590/105308
bobbel
0

Si le but est de copier-coller, j'utilise à la catplace de lessou morepuis le terminal le capture tel qu'il est réellement plutôt que tel qu'il est affiché.

Amos
la source