10
votes

Comment "appliquer" des caractères de retour arrière dans un fichier texte (idéalement dans VIM)

J'ai un fichier journal avec des caractères de retour en arrière (^ h). Je regarde via le fichier de Vim et il peut être assez difficile de voir ce qui se passe.

Idéalement, j'aimerais être capable de "appliquer" tous les ^ h sur une ligne / une plage donnée afin que je puisse voir le résultat final.

Je préférerais beaucoup faire cela au sein de Vim sur une base de ligne, mais une solution qui convertit le fichier entier est meilleure que rien.


4 commentaires

Par curiosité, quel est le but des caractères ^ h? Que voulaient-ils atteindre, soit dans une impression, soit sur la console?


@John Saunders: sur des imprimantes à l'ancienne, ils ont causé une surimpression qui vous a permis de faire audacieux par répétition: x ^ hx ^ hx ^ hx ou souligné: _ ^ ha_ ^ hb_ ^ hc. "Moins" sur Linux utilisait pour les honorer et afficher le texte en gras ou souligné (peut-être que cela le fait toujours!)


Ça marche toujours: $ Echo 'H_ ^ Hell ^ hlo' | moins


@John Saunders: a) Si vous enregistrez ce que vous êtes dactylographié, vous ne voulez peut-être pas prétendre que les caractères supprimés où jamais là-bas. b) Les programmes de commandes simples simples peuvent les utiliser pour mettre à jour l'affichage "en place" (bien que \ r puisse souvent être utilisé).


8 Réponses :


12
votes

Allumez l'option "Coller" (en utilisant : SET COLLETE ), puis appuyez sur DD I 1 sur chaque ligne que vous souhaitez appliquer les backspaces. Cela fonctionne également si vous supprimez plusieurs lignes, voire même l'ensemble du fichier.

La clé ici est que vous utilisez 1 en mode insertion pour "Taper" le contenu du registre 1 (où vos lignes supprimées a été mis) et l'option 'coller' empêche Vim d'utiliser des mappages ou des abréviations.


2 commentaires

Merci! J'ai enregistré ceci (qa) afin que je puisse l'appliquer à une ligne avec @a


Pour vouloir faire plusieurs lignes, le second d doit être modifié. Par exemple, pour effectuer un ensemble de 100 lignes entier, placez votre curseur en haut, puis d 100 1



0
votes

Tout simplement supprimer toutes les occurrences de. ^ h (où. est l'interprétation des regex de.): xxx

(insérer ^ h littéralement en entrant Ctrl-V Ctrl-H)

qui s'appliquera à la ligne actuelle. Utilisez n'importe quelle plage que vous souhaitez si vous souhaitez l'appliquer à d'autres lignes.

Une fois que vous avez effectué une commande : s ... , vous pouvez répéter sur une autre ligne en tapant simplement < Code>: SG (vous devez g à la fin pour réappliquer à toutes les occurrences de la ligne actuelle).


3 commentaires

Cela ne "appliquer" pas les backspaces comme demandé. Nous devons supprimer les personnages que l'AR de ^ H est supposé à l'arrière-plan.


N'as-tu pas vu le point dans la regex? Je suis d'accord que cela ne gère pas une chaîne de caractères arrière de l'espace de retour, mais elle supprime le caractère arrière.


N'as-tu pas vu les multiples backspaces dans mon commentaire? Cela ne fonctionnera pas pour plusieurs backspaces.



9
votes

réponse simpliste: xxx

où ^^ h est:

  1. littéral ^ caractère
  2. Ctrl-V Ctrl-H

    et répétez-le couple de fois (jusqu'à ce que Vim vous dise qu'aucune substitution n'a été faite

    si vous voulez sans répétition, et cela ne vous dérange pas d'utiliser%! Perl: < / p> xxx

    Tous les caractères sont littéraux - vous n'êtes pas obligé de faire Ctrl-V ... n'importe où dans une ligne ci-dessus.

    devrait fonctionner dans la plupart des cas .


3 commentaires

J'aime ça, mais je me demandais s'il y avait un moyen sans avoir à le répéter (pas avec des regexes bien sûr)


[^^ h] ne semble pas vrai. Ne correspond à aucun caractère qui n'est ni ^ ni h ? Quelque chose de plus comme [. \ A] (? (Remarque: la note testée) semble plus correct ... ( \ a correspondrait au début de La chaîne, où ^ h doit être avalé je crois.)


@EyElidirt si vous tapez [^^ h] en utilisant les instructions données, au lieu de simplement copier-coller, cela fonctionne bien.



0
votes

Que diriez-vous de la fonction suivante? J'ai utilisé \% x08 au lieu de ^ h car il est plus facile de copier et de coller le code résultant. Vous pouvez le taper et utiliser ctrl kbd> - v kbd> ctrl kbd> - h kbd> si vous préférez, mais je pensais \% x08 pourrait être plus facile. Cela tente également de manipuler les backspaces au début de la ligne (cela les supprime). XXX PRE>

Utilisez avec: P>

nmap ,b :.ApplyBackspaces<CR>


0 commentaires

1
votes

D'accord, voici une solution de métal nu.

Copier ce code dans un fichier nommé Crypro.c: p>

  man date | crush | say


0 commentaires

11
votes

J'ai googlé ceci en essayant de me souvenir de la commande que j'avais utilisée avant de "appliquer" les backspaces, puis je m'en souvenais: col -b - voici le Manpage . (Cela fait un peu plus et vient de BSD ou plus exactement AT & T UNIX, car le MANPAGE dit, donc si vous êtes sous Linux, vous devrez peut-être installer un package supplémentaire, sur Debian, c'est dans bsdmainutils .) < / p>


0 commentaires

0
votes

Voici un filtre basé sur BASH que vous pouvez utiliser pour traiter l'ensemble du fichier: xxx

Notez que lorsque ^ h apparaît, il est entré dans VIM à l'aide de CTRL. -V Ctrl-h, et le ^^ h est entré comme Maj-6 Ctrl-V Ctrl-h.


0 commentaires

0
votes

Voici un filtre AWK beaucoup plus rapide qui fait la même chose:

#!/usr/bin/awk -f
function crushify(data) {
  while (data ~ /[^^H]^H/) {
      gsub(/[^^H]^H/, "", data) 
  }                                                     
  print data
}

crushify($0)


0 commentaires