Je regardais cette question et je me suis ensuite demandé comment je pourrais implémenter ma réponse qui utilise
sed
uniquement
POSIX
ex
.
L'astuce est que même si sed
je peux comparer l'espace de maintien avec l'espace de motif pour voir s'ils sont exactement équivalents (avec
G;/^\(.*\)\n\1$/{do something}
), je ne connais aucun moyen de faire un tel test dans ex
.
Je sais que dans Vim, je pourrais Y
écrire la première ligne, puis taper
:2,$g/<C-r>0/d
pour presque faire ce que je spécifie - mais si la première ligne contient autre chose que du texte alphanumérique très simple, cela devient vraiment chanceux, car la ligne est déversée en tant que
regex , pas seulement une chaîne de comparaison. (Et si la première ligne contient une barre oblique, le reste de la ligne sera interprété comme une commande!)
Donc, si je veux supprimer toutes les lignes myfile
qui sont identiques à la première ligne - mais pas supprimer la première ligne - comment pourrais-je le faire en utilisant ex
? D'ailleurs, comment pourrais-je le faire en utilisant vi
?
Existe-t-il un moyen POSIX de supprimer une ligne si elle correspond exactement à une autre ligne?
Peut-être quelque chose comme cette syntaxe imaginaire:
:2,$g/**lines equal to "0**/d
<C-r>0
très bonne. Je ne suis pas sûr que vous puissiez faire mieux avec uniquement les commandes Ex, car vous devez protéger les caractères spéciaux. Sans la contrainte conforme POSIX, je pense que vous utiliseriez le commutateur très nomagique \V
, puis vous protégeriez la barre oblique inverse (car elle conserve sa signification spéciale même avec \V
) avec la escape()
fonction dont le deuxième argument est une chaîne contenant tous les caractères que vous souhaitez échapper / protéger. .
:execute '2,$g/\V' . escape(getline(1), '\/') . '/d'
Ou vous pouvez utiliser un autre caractère pour le délimiteur de modèle comme un point-virgule. Dans ce cas, vous n'auriez pas besoin de protéger une barre oblique dans le motif. Cela donnerait quelque chose comme::execute '2,$g;\V' . escape(getline(1), '\') . ';d'
sed
également très bonne. Avec Vim, vous déléguez souvent certaines tâches spéciales à d'autres programmes, et sed
c'est probablement un bon exemple de cela. Soit dit en passant, vous n'avez pas à exécuter sed
tout votre tampon. Si vous souhaitez l'exécuter uniquement sur une partie du tampon, vous pouvez donner une plage. Par exemple, si vous souhaitez filtrer uniquement les lignes entre 50 et 100, vous pouvez taper: :50,100!<your sed command>
.
:execute '2,$g/\V' . escape(getline(1), '\') . '/d'