Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 12/10/2011, à 18:29

G.Alex-713

[Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Bonjour, j'ai deux fichiers de sous-titres srt A et B, le B est la suite du A mais les sous-titres de A et B commencent tout deux à 1 et finissent pour A à 679 et B à 575
moi je voulais que le fichier B aille à la fin du fichier A et que ses sous-titres aillent de 679 à 679+557 vous comprenez ? je comptait faire ça:

let "st = 679"
let "nb = 576 + st"
while [ $st -lt $nb ]
do
let "st += 1"
sed  -re 's/^([0-9]+)(\n([0-9]{2}:){2}[0-9]{2},[0-9]{3} --> ([0-9]{2}:){2}[0-9]{2},[0-9]{3}\n(.+)\n)$/'"$st"'\2/' "B.srt"
done
cat B.srt >> A.srt

la syntaxe d'un srt est:

1
00:03:17,129 --> 00:03:21,792
Texte.
Texte, Texte, texte

2
00:03:27,726 --> 00:03:29,635
Texte, texte texte.

etc...

mais sed ne modifie absolument rien de B.srt !
comment faire pour que cela fonctionne ?

Dernière modification par G.Alex-713 (Le 13/10/2011, à 18:13)

Hors ligne

#2 Le 12/10/2011, à 18:54

Bousky

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

J'ai du mal à comprendre ce que tu veux exactement… Tu peux donner disons les deux premiers sous-titre de B et les mêmes comme tu voudrais qu'ils soient ?

Pour ce qui est de sed, il affiche simplement le résultat, sans écrire dans le fichier. On peut modifier ce comportement avec l'option « -i », mais si ta commande est incorrecte, tu perdras le fichier. Je te conseil de rediriger sed dans un fichier B2, de le vérifier, et s'il est correct de le concaténer à A.


Linux qui plante complètement ? Plus rien ne répond ? On peut toujours le redémarrer proprement :
Alt + SysRq + REISUB (Retourne En Islande Sur Un Bateau !)

Hors ligne

#3 Le 12/10/2011, à 18:57

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

voilà là c'est:
1
00:03:17,129 --> 00:03:21,792
Texte.
Texte, Texte, texte

2
00:03:27,726 --> 00:03:29,635
Texte, texte texte.

3
00:03:17,129 --> 00:03:21,792
Texte.
Texte, Texte, texte

[...]

etc...

et je veux que ça devienne:

680
00:03:17,129 --> 00:03:21,792
Texte.
Texte, Texte, texte

681
00:03:27,726 --> 00:03:29,635
Texte, texte texte.

682
00:03:17,129 --> 00:03:21,792
Texte.
Texte, Texte, texte

etc...

comme ça après la concaténation le numéros seront corrects !

Dernière modification par G.Alex-713 (Le 12/10/2011, à 19:02)

Hors ligne

#4 Le 12/10/2011, à 18:59

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Bonjour,
Peut-être ceci :

awk  '{ if ($0 ~ /^[0-9]+$/) { $1+=679 }; print }' fichier_initial >fichier_modifie

Ceci va ajouter 679 à toutes les lignes qui ne contiennent qu'un nombre.

Dernière modification par pingouinux (Le 12/10/2011, à 19:12)

Hors ligne

#5 Le 12/10/2011, à 19:07

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

ça marche ! c'est quoi cette commande magique !
sauf que... je viens de découvrir un truc terrible... les deux fichiers de sous-titres commençent à 0s ! ToT
je fais comment ?
parce que là c'est:
1
00:00:08,990 --> 00:00:12,751
Texte.
Texte, Texte, texte

2
00:00:14,346 --> 00:00:19,571
Texte, texte texte.

3
00:00:20,079 --> 00:00:23,126
Texte.
Texte, Texte, texte

[...]

etc...

et je veux que ça devienne:

680
00:00:08,990 --> 00:00:12,751 +  00:03:17,129 --> 00:03:21,792
Texte.
Texte, Texte, texte

681
00:00:14,346 --> 00:00:19,571 + 00:03:27,726 --> 00:03:29,635
Texte, texte texte.

682
00:00:20,079 --> 00:00:23,126 + 00:03:32,065 --> 00:03:36,609
Texte.
Texte, Texte, texte

etc...

c'est décourageant...

Dernière modification par G.Alex-713 (Le 12/10/2011, à 19:07)

Hors ligne

#6 Le 12/10/2011, à 19:21

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

G.Alex.713 #5 a écrit :

sauf que... je viens de découvrir un truc terrible... les deux fichiers de sous-titres commençent à 0s ! ToT

Je ne comprends pas. Chez moi :

nom@host:~$ cat ii
1
00:00:08,990 --> 00:00:12,751
Texte.
Texte, Texte, texte

2
00:00:14,346 --> 00:00:19,571
Texte, texte texte.

3
00:00:20,079 --> 00:00:23,126
Texte.
Texte, Texte, texte

nom@host:~$ awk  '{ if ($0 ~ /^[0-9]+$/) { $1+=679 }; print }' ii
680
00:00:08,990 --> 00:00:12,751
Texte.
Texte, Texte, texte

681
00:00:14,346 --> 00:00:19,571
Texte, texte texte.

682
00:00:20,079 --> 00:00:23,126
Texte.
Texte, Texte, texte

Hors ligne

#7 Le 12/10/2011, à 19:26

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Encore plus simple :

awk  '/^[0-9]+$/ { $1+=679 } { print }'  fichier_initial >fichier_modifie

Hors ligne

#8 Le 12/10/2011, à 19:32

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

nan les numéros de sous-titres ça va (mais j'ai pas encore modifié mais regarde plutot les temps d'émmision des sous-titres juste en dessous

Hors ligne

#9 Le 12/10/2011, à 19:46

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

G.Alex.713 #1 a écrit :

moi je voulais que le fichier B aille à la fin du fichier A et que ses sous-titres aillent de 679 à 679+557 vous comprenez ?

Je ne me suis occupé que de modifier les numéros des sous-titres, qui était la seule chose demandée dans le #1.
Pour le reste, je ne comprends pas ce que tu veux. Peut-être cumuler des temps ? Pour moi, ce n'est pas clair.

Hors ligne

#10 Le 12/10/2011, à 21:50

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Oui, parce que les deux fichiers sous-titres commencent au même moment, à 0:00:00 et su superposent au lieu de se suivre !
Mais en plus simple, vous ne pourriez pas m'expliquer pourquoi sed prend mes expressions regulières comme si elles commençaient toutes par ^ ?

Hors ligne

#11 Le 12/10/2011, à 22:55

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

sed est commode pour traiter des fichiers ligne par ligne, et je ne vois pas une utilisation simple permettant de remplacer nombre par 679+nombre.

Pour les temps, je ne comprends pas à quoi correspondent ces valeurs :

00:00:08,990 --> 00:00:12,751 +  00:03:17,129 --> 00:03:21,792

S'il s'agit d'incrémenter tous les temps d'une certaine valeur, je sais faire (en python), mais ce n'est pas ce qui est montré dans l'exemple.

Hors ligne

#12 Le 12/10/2011, à 23:05

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

je cherche à additionner les valeurs

00:00:08,990 --> 00:00:12,751 +  00:03:17,129 --> 00:03:21,792
00:00:08,990 + 00:03:17,129 --> 00:00:12,751 + 00:03:21,792
00+00:00+03:08,990+17,129 --> 00+00:00+03:12,751+21,792

c'est un peu plus clair ?
et sinon tu peux me répondre à ma question ? quelle est cette magnifique commande qu'est awk ?

Hors ligne

#13 Le 12/10/2011, à 23:35

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

man awk

te donnera tous les renseignements. C'est une commande qui fait du traitement ligne par ligne sur les fichiers, en permettant d'extraire différents éléments d'une ligne, et d'y faire des opérations (numériques ou sur les chaînes).
Dans mon exemple :

awk  '/^[0-9]+$/ { $1+=679 } { print }'  fichier_initial >fichier_modifie

je cherche les lignes constituées de 1 ou plus chiffres de 0 à 9 /^[0-9]+$/, et dans ces lignes, j'incrémente le 1er champ (ici, il n'y en a qu'un) de 679. Puis j'imprime la ligne en cours, qu'elle ait été modifiée ou pas.

Pour les temps à additionner, j'avais compris la manière de faire le calcul, mais d'où sortent les valeurs à ajouter (en gras) ?
00:00:08,990 --> 00:00:12,751 + 00:03:17,129 --> 00:03:21,792
00:00:14,346 --> 00:00:19,571 + 00:03:27,726 --> 00:03:29,635

Hors ligne

#14 Le 13/10/2011, à 07:36

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

les premières sont le fichier A et les deuxièmes celles du fichier B

Hors ligne

#15 Le 13/10/2011, à 09:14

Postmortem

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Salut,
Ne faudrait-il pas ajouter la même valeur à tous les temps du fichier B ?


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#16 Le 13/10/2011, à 09:27

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Bonjour,

Est-ce que ça veut dire que les colonnes (1) et (2) correspondent au fichier A, et les colonnes (3) et (4) au fichier B ?

         (1)                       (2)                    (3)                       (4)
00:00:08,990 --> 00:00:12,751 + 00:03:17,129 --> 00:03:21,792

Dans ce cas, contrairement à ce que tu disais dans le post # 5

les deux fichiers de sous-titres commençent à 0s !

le fichier B ne commence pas à zéro.

Pour moi, si j'ai bien compris, et s'il faut mettre les temps du fichier B à la suite de ceux du fichier A, il faudrait incrémenter tous les temps du fichier B d'une valeur constante, correspondant à un poil près au dernier temps du fichier A.

Le post #15 de Postmortem est arrivé pendant que je préparais celui-ci, et je suis d'accord avec lui.

Hors ligne

#17 Le 13/10/2011, à 17:10

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

mais oui !  c'est vrai ! je me suis complètement planté c'est Postmortem qui a raison ! il faut incrémenté les temps du fichier B par la fin du fichier A... enfin c'est pas sûr parce que le premier sous-titre du fichier B pourrais très bien être plus de temps que celui indiqué en dessous que le dernier st du fichier A j'explique:

---------- 00:00:00,000 début du fichier A
--00:00:08,990 debut du premier st du fichier A
--00:00:12,751 fin du premier sous-titre du fichier A
[...]
--01:06:37,590 debut du dernier sous-titre du fichier A
--01:06:42,300 fin du premier sous-titre du fichier A
----------fin du fichier A= 01:06:42,300 ?
----------debut du fichier B = fin du fichier A = 01:06:42,300 ?

et comme on n'est pas sûr on ne peut pas savoir de quelle valeur incrémenter les temps du fichier B: conclusion, on prend l'hypothèse que c'est 01:06:42,300 et si les st sont décalé par rapport à la vidéo mkv HD que je suis en train de télécharger (6e partie sur 11) alors je chercherais avec google un autre fichier srt mais j'aurais la satisfaction de savoir comment faire si un problème du genre ce passe et quel commande avec quel algorithme utiliser

Hors ligne

#18 Le 13/10/2011, à 17:27

pingouinux

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Voici un script en python qui devrait convenir :

#! /usr/bin/env python

import sys, re

ligs=sys.stdin.readlines()

decal_num=679
decal_temps="01:06:42,300"

rec_num=re.compile( '^(?P<N>\d+)$', re.M )
fmt_hms="(\d{2}:){2}\d{2},\d{3}"
rec_temps=re.compile( "^(?P<H1>"+fmt_hms+") --> (?P<H2>"+fmt_hms+")$", re.M )

def H_to_hms(H) :
   hms,mil=H.split(',')
   h,m,s=hms.split(':')
   h,m,s,mil=map(int,(h,m,s,mil))
   return h,m,s,mil

def addition(H1,H2) :
   h1,m1,s1,mil1=H_to_hms(H1)
   h2,m2,s2,mil2=H_to_hms(H2)
   h=m=s=0
   mil=mil1+mil2
   if mil>999 : s,mil=divmod(mil,1000)
   s+=s1+s2
   if s>59 : m,s=divmod(s,60)
   m+=m1+m2
   if m>59 : h,m=divmod(m,60)
   h+=h1+h2
   return "%02d:%02d:%02d,%03d"%(h,m,s,mil)
   
for lig in ligs :
   k=rec_num.search(lig)
   if k :
      lig="%s\n"%(int(k.group('N'))+decal_num)
   k=rec_temps.search(lig)
   if k :
      t1=addition(k.group('H1'),decal_temps)
      t2=addition(k.group('H2'),decal_temps)
      lig="%s --> %s\n"%(t1,t2)
   sys.stdout.write(lig)

Utilisation :

./script_python.py <fichier_B_original >fichier_B_modifie

Modifier éventuellement les valeurs de ces deux lignes :

decal_num=679
decal_temps="01:06:42,300"

Hors ligne

#19 Le 13/10/2011, à 17:43

aduxas

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

Quant à la question pourquoi ta commande initiale ne fonctionnait pas, d'abord toutes les variantes de sed ne marchent pas pareil.  sed lit les données une ligne à la fois, enlève le \n final et la place dans un tampon.  Puis il fait les opérations, rajoute un \n final, imprime la ligne (sauf pour sed -n) et passe à la ligne suivante.  Si tu veux manipuler des \n, il faut utiliser le tampon N et y coller des lignes consécutives dans une boucle avec un label (:label) et la commande b ou t.  Tu devrais pouvoir utiliser perl plus facilement pour le genre manip que tu veux faire.

Une autre manière est de remplacer tous les \n par un caractère bidon "rare", comme ctrl-a  (\a) avec la commande tr, envoyer ce résultat dans la commande sed (en remplacant les \n par \a évidemment), puis défaire les \a avec un autre tr.  Un piège à con:  comme sed ne voit plus qu'une seule ligne, il faut faire des substitutions globales maintenant.  P.e. pour recoller toutes les lignes qui se terminent en coupure de mot (-)

tr '\n' '\a' < fichier.txt | sed 's/-\a//g' | tr '\a' '\n'

Hors ligne

#20 Le 13/10/2011, à 18:12

G.Alex-713

Re : [Résolu]Je n'arrive pas à utiliser sed pour renuméroter des nombres d'

ça marche ! merci !

Hors ligne