Vous pouvez également le faire avec une Ex
commande utilisant sed
comme 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, :%!sort
triera toutes les lignes de votre fichier; :2,8!sort
triera les lignes 2 à 8, etc.)
sed
est l' outil d' édition de flux et se trouve sur tous les systèmes de type Unix. Les concepts clés sed
utilisé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 sed
pour l'enregistrer lors du traitement d'autres lignes d'entrée).
-n
est une option de la sed
commande 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.)
$p
dans la sed
commande signifie "Si vous êtes sur la dernière ligne de sed
saisie, 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 sed
commande stocke quatre lignes de sortie, les inversant telles qu'elles les stockent, puis les imprime. Les $p
commandes 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 -4
dé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 vi
ou ex
vous 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 ex
mode, 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: