
我有一系列很長的沒有分隔字元的網址,格式如下:
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
- 將所有出現的 a 更改
:
為換行符,以分割檔案。 - 代替
http
在該行的末尾- 換行符後面接著
http:
並附加下一行
- 重複一次,偶數行和奇數行都會更新
這些步驟如下所示:
tr ':' '\n' | sed -e '/http$/{N;s/http\n/\nhttp:/}' | sed -e '/http$/{N;s/http\n/\nhttp:/}'
檢查是否有不以 開頭的行
http://
,列印行號。僅當 : 位於 URL 中而非在http
.grep -nv '^http://'