Portál AbcLinuxu, 12. června 2025 12:28
Zdravím. Prvotní motivace pro tento dotaz je strojový překlad titulků ve formátu *.ass. Google umí jen *.srt a *.sub, pokud mu to naservíruju jako kompletní text, v překladu zmrší znakové sekvence.
Takže mě napadlo (sekvence 0,0,0,, je před každým textem a nikde jinde):
1. grep -oP '(?<=0,0,0,,).*' titulky.ass > vystup.txt
2. Tím získám soubor, kde každá textová linka je na novém řádku. Ten můžu bez problémů prohnat překladačem.
3. A teď musím přeloženými řádky nahradit ty původní. Pro každý řádek s 0,0,0,, v souboru titulky.ass nahraď to, co je za 0,0,0,, tím řádkem ze souboru vystup.txt.
Pomohli byste mi prosím s třetím bodem? Díky.
Na getline jsem se díval, nepochopil jsem, jak jej v mém případě použít. Zatím umím přečíst řádek ve vystup a i pomocí sed to nahradit. Jenom to zatím ale nahrazuje úplně všechny, takže už mu jen nějak říct, aby nahradil pouze první výskyt po předchozím:
cat vystup | while read -r line; do
sed "s/0,0,0,,.*/0,0,0,,$line/" tit.ass > kontrolni
done
awk '/0,0,0/{getline <"preklad.ass"} {print}' original.ass
Díky. Tohle přepíše všechny řádky obsahující 0,0,0 na řádek z překladu. Je však potřeba zachovat původní řádek až po 0,0,0,, včetně a to za tím nahradit překladem. Např.
originál:
Dialogue: 0,0:00:07.50,0:00:09.90,film_Italics,Kaz,0,0,0,,Simple original
Dialogue: 0,0:00:09.50,0:00:09.90,film_Italics,Kaz,0,0,0,,Two
překlad:
Jednoduchý originál
Dva
výsledek:
Dialogue: 0,0:00:07.50,0:00:09.90,film_Italics,Kaz,0,0,0,,Jednoduchý originál
Dialogue: 0,0:00:09.50,0:00:09.90,film_Italics,Kaz,0,0,0,,Dva
awk '/0,0,0,,/{sub("0,0,0,,.*$", "0,0,0,,"); line=$0; getline <"preklad.ass"; $0=line $0;} {print}' original.ass
Jo no. Chtěl jsem na to přijít, ale jak tak vidím, mám ve zpracování textu veliké mezery. Děkuji za to awk, funguje jak má. S malou úpravou jsem vytvořil skript, který všechny *.ass v dané složce přeloží pomocí Google translate na P-*.ass. Je nutné nainstalovat balík apt install translate-shell
for file in *.ass; do
grep -oP '(?<=,,).*' "$file" > vycuc.txt
sed -i 's/\\N//g' vycuc.txt
sed -i 's/^ *//' vycuc.txt
trans sk:cs file://./vycuc.txt > preklad.txt
awk '/,,/{sub(",,.*$", ",,"); line=$0; getline <"preklad.txt"; $0=line $0;} {print}' "$file" > "P-$file"
done
rm *.txt
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.