Vous pouvez également le faire avec une Excommande utilisant sedcomme filtre externe:
:%!sed -n 'h;n;G;h;n;G;h;n;G;p'
Cette version ignorera (supprimera) toutes les lignes supplémentaires au-delà d'un multiple de 4. Pour conserver le dernier ensemble de moins de 4 lignes (inversé), utilisez:
:%!sed -n '$p;h;n;G;$p;h;n;G;$p;h;n;G;p'
Le %moyen ici « Chaque ligne du tampon. »
La !commande signifie «Exécutez la commande suivante avec les lignes spécifiées en entrée et remplacez les lignes spécifiées par la sortie de la commande». (Cela s'appelle un filtre; très pratique pour des choses comme le tri, par exemple, :%!sorttriera toutes les lignes de votre fichier; :2,8!sorttriera les lignes 2 à 8, etc.)
sedest l' outil d' édition de flux et se trouve sur tous les systèmes de type Unix. Les concepts clés sedutilisés ici sont l '"espace modèle" (qui, par défaut, contient uniquement chaque ligne de l'entrée à son tour), et l' "espace d'attente" (qui est l'endroit où vous pouvez coller du texte supplémentaire lors de l'utilisation sedpour l'enregistrer lors du traitement d'autres lignes d'entrée).
-nest une option de la sedcommande pour supprimer ses actions par défaut d'impression de l'espace de motif (car dans ce cas, nous ne voulons imprimer que lorsque nous le disons explicitement.)
$pdans la sedcommande signifie "Si vous êtes sur la dernière ligne de sedsaisie, imprimez (l'espace de motif)."
h signifie "coller le contenu actuel de l '" espace modèle "dans" l'espace d'attente ", en écrasant tout ce qui s'y trouve."
n signifie "remplacer le contenu de" l'espace modèle "par la ligne suivante de l'entrée."
G signifie "ajouter à l '" espace modèle ": une nouvelle ligne suivie du contenu de" l'espace d'attente "."
Dans l'ensemble, la sedcommande stocke quatre lignes de sortie, les inversant telles qu'elles les stockent, puis les imprime. Les $pcommandes ajoutées dans la deuxième version garantissent que si la dernière ligne du fichier est atteinte autrement que sur un multiple de 4 lignes, les lignes sont toujours imprimées.
Pour une approche alternative et interactive sans utiliser de fonctionnalités spécifiques à Vim et sans utiliser de filtre externe:
:4
pour aller à la quatrième ligne.
:.m -4 | +3m . | +2m . | +5
pour inverser les quatre lignes précédentes (1-4) et laissez votre curseur sur la ligne 8.
.m -4déplace la ligne actuelle juste après la ligne de quatre lignes en arrière (en laissant le curseur sur la ligne déplacée).
+3m .déplace la ligne qui se trouve 3 lignes après la ligne actuelle, juste après la ligne actuelle, en laissant le curseur sur la ligne déplacée. +2m .bien sûr fonctionne de la même façon.
+5 place le curseur à cinq lignes de l'endroit où il se trouve.
Répétez comme vous le souhaitez.
Dans Vim, vous pouvez répéter toute cette commande avec @:, puis recommencer avec @@. En Posix viou exvous devez insérer :.m -4 | +3m . | +2m . | +5 une ligne de texte, supprimer un tampon appelé (registre), puis exécuter ce tampon appelé (registre).
Donc en exmode, inverser les lignes de manière interactive en utilisant uniquement les fonctionnalités spécifiées par POSIX, et en commençant par 17 lignes de texte:
Entering Ex mode. Type "visual" to go to Normal mode.
:0a # Append following text after "line 0" (i.e. insert at start of file).
.m -4 | +3m . | +2m . | +5
. # End text insertion
:d k # Delete that line to register k
line1 # This is a printout of the current line
:4 # Move to line 4
line4
:@k # Execute register k to reverse lines 1-4
line8
:@@ # Execute register k again
line12
:@@ # Execute register k again
line16
:@@ # Execute register k again
line17
:%p # Print the whole buffer (just to see what was done)
line4
line3
line2
line1
line8
line7
line6
line5
line12
line11
line10
line9
line16
line15
line14
line13
line17
:wq # Save and quit
Lectures complémentaires: