J'ai une série de fichiers srt (sous-titres de films) dont certaines chronologies se chevauchent sur la vidéo! Cela signifie que certaines chronologies sont affichées environ 1 à 2 secondes de plus qu'elles ne le sont dans le film et sont en conflit avec les suivantes!
par exemple:
1
00:00:01.000 --> 00:00:07.000
The following content is provided
2
00:00:04.000 --> 00:00:10.000
under a Creative Commons license.
'07' chevauche '04'!
Je veux écraser la première partie des lignes de temps sur la 2ème partie de leur ligne précédente. Veillez à ce que toutes les chronologies n'interfèrent pas les unes avec les autres. certains d'entre eux sont corrects et plus courts que leur prochaine chronologie! L'ingérence ne concerne que certains d'entre eux.
J'ai posé cette question sur # awk IRC an @ geirha a écrit les excellents scripts ci-dessous. Le script peut être utilisable par d'autres personnes. Le problème de chevauchement des sous-titres est courant en raison d'une erreur humaine lors du sous-titrage d'un film!
Supposons que vos délais soient au format ci-dessous:A --> B
C --> D
Remplacement de B par C:
gawk '
BEGIN {
RS = "";
OFS = FS = "\n";
getline;
n = split($0, prev_rec);
split($2, prev_time, / --> /);
}
{
split($2, a, / --> /);
if (a[1] < prev_time[2])
prev_rec[2] = prev_time[1]" --> "a[1];
for (i=1;i<=n;i++)
print prev_rec[i];
printf("\n");
n = split($0, prev_rec);
split($2, prev_time, / --> /)
}
END {
print
}' SUBTITLE.srt > RESULT.srt
Le code ci-dessus compare [~ # ~] b [~ # ~] et [~ # ~] c [ ~ # ~] de cette façon:
Si B> C => alors exécutez cette charmante commande pour remplacer B.
Si B <C => Ne rien faire!
Remplacement de C par B:
gawk '
BEGIN {
RS="";
OFS=FS="\n";
prev="00:00:00"
}
{
split($2,a,/ --> /);
if
(a[1] < prev) $2=prev" --> "a[2];
print $0"\n"; prev=a[2]
}' SUBTITLE.srt > RESULT.srt
Pour utiliser des scripts sur une certaine quantité de fichiers srt dans un dossier:
for file in *.srt
do xxx "$file" > "$file.tmp" && mv "$file.tmp" "$file";
done
Remplacez xxx par les bons codes de script!