2014-07-14 47 views
-2

我有一個字幕文件。我想要打破所有字幕。 一個例子:Unbreak特定文本行

1 
00:02:08,315 --> 00:02:10,786 
Hello Jim. 
How are you? 

2 
00:02:10,869 --> 00:02:13,192 
I'm well. 
And you? 

我想轉換爲:

1 
00:02:08,315 --> 00:02:10,786 
Hello Jim. How are you? 

2 
00:02:10,869 --> 00:02:13,192 
I'm well. And you? 

字幕數字和時間碼不應該別讓。 這怎麼能用sed完成?

+0

連接線的標準是什麼?它是每第三和第四行嗎? – anubhava

+0

有些子只有一行。這是我的問題。其他字幕有兩行。我的問題:如何將所有字幕解開爲一行? – user2874781

+0

您需要澄清如何識別輸入文件中的字幕? – anubhava

回答

3

您可以:

awk 'BEGIN { RS = ""; FS = "\n" } 
    NR > 1 { print "" } 
    { print $1; print $2; 
     for (i = 3; i < NF; ++i) printf "%s ", $i; 
     print $NF; 
    }' your_file.txt 

輸出:

1 
00:02:08,315 --> 00:02:10,786 
Hello Jim. How are you? 

2 
00:02:10,869 --> 00:02:13,192 
I'm well. And you? 
+0

對不起,這個awk腳本不起作用。您可以使用www.podnapisi.net提供的字幕文件進行測試。 awk腳本只適用於上面的例子。 – user2874781

+2

@ user2874781你應該更新你的文章。例如,什麼字幕?你能給一個特定的鏈接嗎? – konsolebox

+0

http://www.podnapisi.net/de/red-planet-2000-subtitles-p1275214 – user2874781

0

這個小awk腳本將完成這項工作。它比所需要的稍微複雜一些,但可以作爲更高級處理的基礎。也許......

awk 'BEGIN      { state = "copy" } 
    (state == "copy")   { print } 
    /-->/      { state = "text"; next } 
    /.+/ && (state == "text") { printf("%s ",$0); next } 
    /^$/      { printf("\n\n"); state = "copy"; next } 
    END      { printf("\n") } 
    ' < sub.txt 

鑑於你的輸入文件,這些農產品:

1 
00:02:08,315 --> 00:02:10,786 
Hello Jim. How are you? 

2 
00:02:10,869 --> 00:02:13,192 
I'm well. And you? 


編輯: 看樣本文件後你給作爲對其他答案評論,我只能 猜想你要合併連續的 <i>...</i>行。因此,這個簡單的Perl招就夠了:

sh$ unzip 56939b22f5174a770a79f6b0b0cf7caaee1c9dfb.zip 
Archive: 56939b22f5174a770a79f6b0b0cf7caaee1c9dfb.zip 
inflating: Red.Planet.2000.1080p.REPACK.BluRay.x264-7SinS.srt 

sh$ perl -0pe 's|</i>\r\n<i>| |m' < Red.Planet.2000.1080p.REPACK.BluRay.x264-7SinS.srt 

1 
00:00:35,661 --> 00:00:40,792 
<i>By the year 2000, we had begun to overpopulate, pollute and poison our planet...</i> 

2 
00:00:41,208 --> 00:00:43,176 
<i>...faster than we could clean it up.</i> 

3 
00:00:43,377 --> 00:00:48,053 
<i>We ignored the problem for as long as we could but we were kidding ourselves.</i> 
+0

對不起,這個awk腳本不起作用。您可以使用www.podnapisi.net提供的字幕文件進行測試。 awk腳本只適用於上面的例子。 – user2874781

+0

@ user2874781我確切地說不確定你在找什麼,但是從我所能猜到的,我已經編輯了我的答案。 –

+0

@Sylvain Leroux,爲什麼你在你的s ///表達式中使用'm'和's'修飾符,在這種情況下他們毫無意義。在該文件中,有些行沒有標籤,因此您的解決方案將被打破。刪除\ r並嘗試我的解決方案最簡單,哈哈! – lihao

0

如果所有的子標題塊由空行分隔,你想保留每個塊的前兩行並將其餘的與空間合併。那麼你可以使用Perl:

perl -F'\n' -aln00e 'print "$F[0]\n$F[1]\n", (join" ",@F[2..$#F]), "\n"' myfile.txt 

然而,如果在口語行中有空行,這將被打破。但我想你不會在意刪除包含在口述行中的空行。如果是的話,只需要一個預處理步驟:

@(repeat) 
@num 
@fromtime --> @totime 
@(collect) 
@line 
@(until) 

@(end) 
@(output) 
@num 
@fromtime --> @totime 
@(rep)@line @(last)@[email protected](end) 
@(end) 
@(end) 

運行:在TXR語言

perl -lp0777e 's/\n\n+(?!\d+\n\d\d:\d\d:\d\d,\d\d\d\s*-->)/\n/g' myfile.txt 
0

解決方案

$ txr unbreak.txr sub.srt 
1 
00:02:08,315 --> 00:02:10,786 
Hello Jim. How are you? 
2 
00:02:10,869 --> 00:02:13,192 
I'm well. And you? 

所需的輸出是很容易實現的,即使我們已經精確地提取了SRT文件的更多功能,而不是完成工作。我們可以輕鬆地將代碼轉換成更復雜的轉換。

0

此命令行工作過:

cat red.srt | tr '\012' '\040' | sed 's/[0-9]\+ ..:..:..,... --> ..:..:..,.../\n\0\n/g' | sed 's/^[0-9]\+ /\n\0\n/g' | sed 's/^ *//g; s/ \+/ /g; s/ *$//g' | sed '1,2d' > final.srt 

我知道,這個解決方案是不優雅,但它的作品完美的我。