Vim : ajout de nombres incrémentés

Bonjour à tous, pourriez vous m’aider sur ceci s’il vous plaît:

Je cherche dans vim à rajouter des nombres incrémentés de 1 à n,
avant une occurence ayant la même forme, mais des variables différentes

Pour le contexte :
J’ai commencé à écrire des sous-titres en partant de rien, au format .srt qui sont sensés avoir cette forme :

[code]1
00:00:00,000 --> 00:00:10,000
blabla

2
00:00:10,000 --> 00:00:20,000
la suite
du texte[/code]cependant je n’ai pas mis les numéros avant les timeline, car je ne le savais pas alors :

[code]00:00:00,000 --> 00:00:10,000
blabla

00:00:10,000 --> 00:00:20,000
la suite
du texte[/code]Je dois maintenant les rajouter, le nombre de lignes écrites nécessite de trouver une technique automatique.

J’utilise plutôt vim. J’ai trouvé alors une astuce qui me rapprochais du résultat souhaité en passant en mode record dans vim:

qa (pour entrer en mode [i]record[/i]) Y (copier la ligne, le numéro 1) p (le coller) ctrl a (l'incrémenter) q (quitter le mode [i]record[/i]) 15@a (répéter 15 fois - pour le test -)Le problème de cette méthode est que les numéros se mettent avec le même saut de ligne tel qu’enregistré dans le record. Mais les sous titres ont parfois deux ou plusieurs lignes, ce qui fait que les numéros se retrouvent mélangés aux lignes, donc pas en tête des timeline:

[code]1
00:00:00,000 --> 00:00:10,000
blabla

00:00:10,000 --> 00:00:20,000
la suite
2

du texte[/code]Si vous avez des idées… en vous remerciant

si j’ai bien compris tu as

[quote]00:00:00,000 --> 00:00:10,000
blabla

00:00:10,000 --> 00:00:20,000
la suite[/quote]

et tu veux

[quote]
1
00:00:00,000 --> 00:00:10,000
blabla

2
00:00:10,000 --> 00:00:20,000
la suite[/quote]

si c’est bien ca alors voila ce que je ferai:
Mettre 1 au debut du fichier

[quote]1
00:00:00,000 --> 00:00:10,000
blabla

00:00:10,000 --> 00:00:20,000
la suite[/quote]
Place toi sur le 1 puis
qa
Y
2
/^[0-9][0-9]:[0-9]:[0-9],[0-9]*
flèche up
p
Ctrl A
q

puis tu l’essayes 10@qa

Salut, et merci pour la réponse.

J’ai essayé ta proposition, ça a l’air de marcher.
J’ai aussi trouvé une solution qui ressemble un peu à la tienne:

qa (passer en [i]record mode[/i]) V"+y (select la ligne en [i]visual mode[/i] - le numéro "1" - et copier) /--> (chercher la chaîne "-->" pour les timelines*) nn (aller à l'occurence suivante) ↑ (haut) p (coller après le curseur) q (quitter le [i]record mode[/i]) 10@a (répéter 10 fois pour l'essaie) * merci pour la façon de chercher une chaîne de nombres (je galère un peu avec les maths)mais…

mais le problème est de trouver le nombre de fois appliquer la solution (x@a)
pour mes sous-titres à 3000 lignes, j’ai passé 45mn pour trouver la valeur adéquat en tatonnant.
Je pense naturellement qu’il y a autre chose qui soit plus efficace :
qui répète la manoeuvre jusqu’à la fin du fichier, sans se soucier du nombre d’occurences.

(edit: le formattage du texte ne marche pas… zut !^^)

Bonjour,

vim est-il imposé ?

car :

$ awk ' /-->/ { printf "%d\n%s\n" ,++i, $0 } ! /-->/ ' <<EOF
> 00:00:00,000 --> 00:00:10,000
> blabla
>
> 00:00:10,000 --> 00:00:20,000
> la suite
> du texte
> EOF
1
00:00:00,000 --> 00:00:10,000
blabla

2
00:00:10,000 --> 00:00:20,000
la suite
du texte

donc dans ton cas :

awk ' /-->/ { printf "%d\n%s\n" ,++i, $0 } ! /-->/ ' fichier.srt > new_fichier.srt

ça ne te simplifie pas la tâche ?

2
/–> (chercher la chaîne “–>” pour les timelines*)
signifie que je fais deux fois la recherche c’est donc la même chose que

/–>
nn

Je crois qu’on ne peut pas utiliser une macro sur une plage (à vérifier quand même)
Voila ce que je te propose:

pour obtenir le nombre de timelines:
:! grep -o “^[0-9]:[0-9]:[0-9],[0-9]” % | wc -l

Tu obtiens donc le nombre de fois qu’il faut appliquer ta macro.
explication: ! signifie que l’on utilise un programme extérieur (ici grep et wc)
% est le nom du fichier que tu utilises

Pour info pour obtenir le nombre de lignes:
:! cat % | wc -l

[quote=“limax”]Pour info pour obtenir le nombre de lignes:
:! cat % | wc -l[/quote]
Voir :

Sinon chez moi Ctrl+g me le dis aussi.

C’est juste que le nom du fichier apparaît avec ta commande.
Il m’est arrivé d’utiliser :r! cat % | wc -l alors je garde l’habitude.

Salut à tous ! et merci pour vos réponses !

Alors dans l’ordre,
Totor,
vim n’est imposé “que” par ce que je maîtrise vaguement ou pas du tout.
awk, par exemple, j’y suis pas encore mais, je peux appliquer des commandes shell. J’ai donc essayé ta technique, et elle marche nickel !
J’essaie encore de décoder la ligne de commande ^^
Juste, il y a un “” qui est apparu devant le premier timeline.
Je comprends que ces caractères n’ont pas d’insidence sur le fichier.
Donc, awk, je valide ^^

limax,
indeed ! la méthode permet de trouver le nombre de chaines timeline ainsi que le nombre de lignes. Nickel aussi !
En revanche, tu évoques une macro, ça sort encore de mes connaissances : je n’en ai jamais fait.

MisterFreez
je note aussi ta variante pour le nombre de lignes.
ctrl g marche aussi.
(ctrl g me rappelle que je dois trouver le moyen de remapper ctrl a et x pour l’intégration avec screen, mais c’est un autre sujet, je posterai si je ne trouve pas)

En somme, problème résolu ! Merci à tous !

[quote=“jarlax”]
limax,
indeed ! la méthode permet de trouver le nombre de chaines timeline ainsi que le nombre de lignes. Nickel aussi !
En revanche, tu évoques une macro, ça sort encore de mes connaissances : je n’en ai jamais fait.[/quote]
pour la macro, je parlais de ton enregistrement que tu as fait dans le registre a avec qa

oh ! les quelques commandes en record mode, c’est une macro ? oooohhh !
Alors tu voulais dire quoi quand tu évoquais d’utiliser une macro sur une plage ? Une plage de nombres ?

par exemple:
:%s/aaa/bbb/ tu substitues aaa par bbb sur tout le texte % , la plage est tout le texte
:10,200s/aaa/bbb/ tu substitues aaa par bbb des lignes 100 à 200. la plage est ici le texte des lignes 100 à 200.

:h plage ou :h range

Bonjour,

Pour faire simple :
awk lit le fichier en entrée ligne par ligne et nous permet de réaliser des traitements sur les lignes que l’on identifie via la syntaxe //
Aussi il construit un ensemble de variable correspondant à chaque mot de la ligne.
Ainsi $1 correspond à la valeur du 1er mot, $2 au 2nd mot, $3 au 3ème … etc…
Il y a également la valeur $0 qui correspond à la ligne entière.

Donc dans notre cas /–>/ permet d’identifier toutes les lignes que tu appelles “timeline” et d’y appliquer le traitement printf “%d\n%s\n”, ++i, $0 qui se trouve dans le bloc { … }.
Ce traitement affiche la variable i après l’avoir incrémentée de 1 grace au ++ (%d référence ++i), un retour à la ligne (\n) puis la ligne “timeline” (%s référence $0) et un dernier retour à la ligne (\n)

Pour toutes les autres lignes (identifiées par ! /–>/), on n’applique pas de traitement particulier. On laisse celui par défaut qui est l’affichage de la ligne.

Très étonnant !

J’ai fini la prmière partie des sous-titres !
maintenant la traduction !

alors, si je comprends bien
limax:
% (pour tout le texte) ou 10,200 (pour une selection), ou autre, c’est la plage sur laquelle sera appliqué ce qui suit, dans ce cas sed.

Totor,
j’ai lu un peu le man de awk, et avec l’exemple que tu m’as donné, je pense que je vais pouvoir l’appliquer dans d’autres situations. On progresse ^^

Oui, pour les caractères , ils étaient en bleu. Ils ont disparu dès que j’ai réouvert le fichier avec un éditeur de texte standard (leafpad dans mon car - j’utilise lxde -)

Un petit couac avec vim cependant,
(j’ouvre un autre sujet si nécessaire)

Comme je n’ai pas trouvé le moyen d’alligner le texte avec du .srt
(tous les sites lus me disent que je ne peux que bold, underscore, itallique ou une couleur
Alors, j’ai dû y aller à coup d’espaces par-ci, par-là.
Mais, si j’ouvre le fichier avec vim, il me retire tous les espaces “superflux”, rendant caduque tout le travail de mise en forme.

Est-ce une “spécificité” de vim, ou est-ce dû à un réglage dans vimrc (je n’ai pas encore fait le ménage dedans) ?

Totor,
puisque vim me vire toutes les mises en pages et espaces superflux, je dois travailler avec awk ou sed pour retirer ou remettre les numéros.

là, j’essaie de supprimer les numéros, donc de défaire ce qu’on a fait.

je cherche dans man awk comment effacer, j’ai essayé “del”, “suppr”, mais je n’y suis pas encore.
De plus, là en toute logique, il cherche à ajouter quelque chose (printf), et non à retirer (oui ?).
Comment je peux faire ça ?

Salut,

Cela me paraît louche que les espaces soit supprimé dans vim, tu es certains que tes alignements ne sont pas en partie réalisés à l’aide de tabulations? Une taille différente de celle utilisée dans vim pourrait expliquer les affichages distincts. Pour le savoir, c’est très simple, il te suffit d’utiliser la commande :l sur une ligne ayant un affichage différent. La ligne va alors s’afficher tout en bas avec tous les caractères spéciaux qu’elle contient. Si tu vois un ^I c’est qu’il y a une tabulation :wink:

bonsoir,

awk -r '! /^[0-9]+$/' fichier.src > new_fichier.src

# avec sed
sed -i_ -r '/^[0-9]+$/d' fichier.src

note :pas testé :wink:

edit : ajout option -i pour sed

  • Totor,
    la commande sed marche,
    par contre, la fonction awk ne marche pas : il semble ne pas comprendre l’option -r

après, j’ai essayé de reprendre la première fonction awk pour incrémenter des nombres, mais cette fois à partir de 0 (zéro). Tu précises que c’est la variable i incrémentée par le ++ qui fait le truc, alors j’ai regardé dans le man, mais je ne trouve pas pour que i commence à zéro.

  • Taurre,
    my mistake, il semble que vim ne modifie pas, en effet les espaces ajoutés, mais que ce soit le gnome-subtitles ou subtitleeditor qui m’aie viré tout ça.
    j’ai utilisé la commande :l pour repérer les caractères spéciaux, c’est effectivement utile.
    Pour ce qui est des tabulations, j’avais déjà tenté de remplacer les espaces par des tabs, mais j’avais effectivement déjà remarqué que ça ne marchait pas, alors je les ai retirés.

edit: erratum:
vim ne me vire pas les espaces utilisés pour alligner un sous-titre sur la droite uniquement,
mais il vire les espaces des lignes vides utilisés pour décaller un espace vers le haut, ou vers la gauche

dans le vimrc j’ai une option qui enlève les espaces en fins de lignesau BufWrite * silent! %s/[\r \t]\+$//mais la commenter/supprimer ne change pas la donne

C’est que tu ne dois pas utiliser gawk alors :confused:

il faut rajouter un bloc “BEGIN” :

awk 'BEGIN {i=0} /-->/ { printf "%d\n%s\n" ,++i, $0 } ! /-->/ ' fichier.srt > new_fichier.srt

Merci,
incrémenter à partir de zéro fonctionne.

J’ai installé gawk, -r marche désormais.

Je pense m’en être sorti de ces sous-titres, avec améliorations de compétences techniques en valeur ajoutée ^^
sankyou all !

Je ferai un howto je pense, qui regroupe ces astuces, ça peut être utile.