在非常大的檔案中替換字串

在非常大的檔案中替換字串

我有一系列很長的沒有分隔字元的網址,格式如下:

http://example.comhttp://example.nethttp://example.orghttp://etc...

我希望每個 URL 都換行。我試圖透過使用 sed 將“http://”的所有實例替換為“\nhttp://”來做到這一點

sed 's_http://_\nhttp://_g' urls.txt

但發生分段錯誤(記憶體違規)。我只能推測檔案的絕對大小(超過 100GB)導致 sed 超出了某個限制。

我可以將文件分割成幾個較小的文件進行處理,但“http://”的所有實例都需要保持完整。

有一個更好的方法嗎?

答案1

有了它,awk您可以避免一次閱讀大量文字:

awk -vRS='http://' -vORS='\nhttp://' 1 urls.txt > urlsperline.txt

成功可能取決於所使用的awk實現。例如,gawk工作正常,但mawk崩潰。

答案2

這將完成這項工作:

perl -pe 'BEGIN { $/ = "//" } s!(?=http://\z)!\n!' urls.txt

透過設定$/,我更改了行的定義,因此它//以換行符號結尾。這使得 Perl 一次讀取一個 URL。 URL 不太可能包含//except 在方案之後,但如果包含也沒關係,正規表示式將阻止它添加虛假的換行符。

如果您想避免在第一個 URL 之前新增空白行:

perl -pe 'BEGIN { $/ = "//"; print scalar <> } s!(?=http://\z)!\n!' urls.txt

您可以嘗試進行基準測試,看看是否s!http://\z!\nhttp://!更快。它們是等價的。請注意,/g替換時不需要該標誌,因為每“行”只能有一個匹配項。

答案3

  1. 將所有出現的 a 更改:為換行符,以分割檔案。
  2. 代替
    • http在該行的末尾
    • 換行符後面接著http:並附加下一行
  3. 重複一次,偶數行和奇數行都會更新

這些步驟如下所示:

tr ':' '\n' | sed -e '/http$/{N;s/http\n/\nhttp:/}' | sed -e '/http$/{N;s/http\n/\nhttp:/}'
  1. 檢查是否有不以 開頭的行http://,列印行號。僅當 : 位於 URL 中而非在http.

    grep -nv '^http://'

相關內容