2015-10-30 35 views
0

我有一個5.1GB文件,這是一行文本沒有換行符。Sed命令不能完全解析輸入文件

我已經提供了以下命令來添加新的行字符後,每{...}

's/{[^}]*}/&\n/g' input > output.txt

這如預期運作,但它並沒有完全完成,但不會引發錯誤消息到控制檯。

它沒有完成的原因是因爲output.txt總是1.1GB所以我缺少~3.9GB的數據。

我也試圖做一個內聯sed -i 's/{[^}]*}/&\n/g' input,它也產生一個1.1GB文件。

sed是否限於特定的輸出尺寸?我找不到類似的用例。

此外,我嘗試使用tr這確實產生完整的輸出大小,但它似乎不能用tr命令替換1個字符與多個字符。這不起作用:

tr '}' '}\n' <input> output.txt

有沒有一種方法,使SED全面完成文件?

+2

難道是有一個EOF字符(0×04或Ctrl-d)躲在你的輸入文件選項-u?這可能會使sed過早終止。 –

+1

大多數'sed'實現沒有行長度限制,但'sed'需要malloc足夠的內存來處理它。您可能會對可用內存造成限制。 'Perl'通常不存在這個問題,如果你不想使用'perl',你可以將輸入分成更小的文件,通過sed處理並在最後結合它們。 –

+0

您不必匹配整個塊,只需要匹配'}':'s /} /} \ n'/ g'。 (將我以前對這個評論的回答降級,因爲它沒有解決實際問題。) – chepner

回答

1

Perl怎麼樣?

perl -e '$/ = "}"; print "$_\n" while <>' input > output.txt 
  • $/是輸入記錄分隔符。
  • <>是鑽石操作員 - 它從輸入文件中讀取由$/分隔的塊。
  • $_是主題變量,由while <>填充。
+0

像一個魅力一樣工作,只是爲了幫助我,也許別人沒有使用Perl,這是如何工作的?我假設'$ _'是最後一場比賽,'<>'不是空的?那麼'$ \ ='是那個當前角色? –

+1

@ChrisEdwards:更新。 – choroba

0

嘗試也許是無緩衝

sed -u 's/{[^}]*}/&\n/g' input > output.txt 

的也

sed -u 's/{[^}]*}/&\n/;P;D' input > output.txt