Remove Empty Lines 是一個瀏覽器式的 drain removal 工具,會從貼上的純文字中移除完全空白或僅含空白字元的列,同時保留每一行的原始內容。要使用它,請將文字貼入輸入框,選擇是否將僅含空白字元的列視為空行(預設),或僅移除零長度的行,接著處理結果並確認輸出下方顯示的「已移除/已保留」行數。不會上傳任何內容,保留行內的文字也不會被重新格式化,工具可處理最多 1,000,000 個 UTF-16 code unit 的輸入,既不抽樣也不會靜默截斷。工具對每一行僅做一項判斷:所選的「空行」述詞是否成立;其他所有內容——縮排、大小寫、行內空白與標點符號——皆保持原樣。無論您是想找字面上的 drain unclogger,或是為了文字編輯器的空白行清理而來到這裡,本頁描述的都是後者,並會逐步說明 Remove Empty Lines 工具的每個選項。
在純文字編輯的領域中,「drain」這個詞可以作為一個有用的隱喻,代表中斷內容流動的、多餘的間隙。段落之間的空白行、雙倍行距的清單項目,以及由編輯器、試算表或 IDE 匯出所留下的零散空白行,表現上都像是文件中的阻塞 drain:它們拖慢掃讀速度、增加檔案體積,也讓下游工具必須更費力地處理。因此,純文字導向的 drain removal 工具只有一項任務——識別哪些列不具備有用的內容,並在重建結果時略過它們。本網站上的 Remove Empty Lines 工具正是圍繞著這個單一判斷所打造。

What Counts as a Drain Removal Tool for Plain Text
在文字工具網站中,drain removal 工具指的是任何能夠偵測出「不具實質內容」之列,並在一次處理中將其扣除的工具。純文字作業中對「空行」存在兩種不同的定義,而混淆這兩者,正是空白行清理破壞內容最常見的原因:
- 嚴格空行 (Strict empty row):UTF-16 code-unit 長度為零的一行。在前一個換行與下一個換行之間完全沒有任何字元。
- 僅含空白字元的行 (Whitespace-only row):在檢視器中看似空白,但實際上包含空格、Tab、非斷行空格,或其他瀏覽器 String.trim() 會移除的 Unicode 空白字元。
Remove Empty Lines 將這兩種定義以單一開關形式同時呈現。視覺上看起來空白的列幾乎都屬於「僅含空白字元」這一類,因此該選項預設為啟用。當您處理的是原始碼、表格資料匯出,或具有縮排意義的階段性設定檔(其中僅含縮排的行具有意義)時,應關閉此開關,以保留那些行。選擇正確的述詞,是您開啟 Remove Empty Lines 時唯一需要做的真正判斷;其餘步驟都是機械式的。
How to Run a Drain Removal Pass With Remove Empty Lines
以下步驟遵循文件記載的操作流程,並補充讀者最常詢問的邊界條件。所謂「一次處理 (pass)」,指的是從第一行到最後一行的單次有序評估。
- 貼上含有空白行的文字至輸入框。工具接受最多 1,000,000 個 UTF-16 code unit,足以涵蓋大多數散文文件、CSV 匯出與程式碼檔案。對於混合 CRLF、單獨 CR 與 LF 換行符的輸入,皆能正確解析,因為分割器會依序檢查 CRLF、再檢查 CR、再檢查 LF,因此不會有列被重複計算。
- 若要處理視覺上的空行,請保留「僅含空白字元」選項啟用;若僅移除零長度行,則將其關閉。保留啟用是最安全的起點,因為看不見的縮排正是「實際僅含空白字元」卻被當作空行的最常見原因。只有在您明確需要保留那些「僅含縮排或零散空格」的行時,才將其關閉。
- 透過動作按鈕執行文字處理。實作上僅進行一次處理,逐一評估每行的作用中述詞,按原始順序附加保留的內容,接著無論來源使用何種換行,皆以 LF 行尾重新接合。因此,混合的來源換行會在輸出中被統一為單一一致的分界風格。
- 請確認結果下方顯示的「已移除」與「已保留」計數。摘要會告訴您總共檢視了多少輸入行、保留了多少行、捨棄了多少行。在將清理後的輸出覆蓋到原始檔案之前,請將這些數字視為合理性檢查——特別是在以空行輔助可讀性的程式語言或格式中。
無論是變更輸入文字或選項,都會立即清除先前的輸出與計數,因此您無需手動重設即可重新執行該輪處理。一旦計數顯示,結果即可立即複製或下載。
Choosing Between Whitespace and Strict Empty Removal
這兩種模式各自適用於不同的來源資料,下表摘要說明在何種情境下何者為較安全的預設。
| 情境 | 僅含空白字元(預設) | 僅嚴格空行 |
|---|---|---|
| 段落之間以雙換行分隔的貼上散文 | 建議使用 | 會漏掉視覺上的空行 |
| 從所見即所得編輯器匯出的 Markdown 草稿 | 建議使用 | 會漏掉僅含空格的行 |
| 含有空白儲存格的試算表匯出 | 建議使用 | 會漏掉僅含單一空格的佔位列 |
| 縮排行具有意義的程式碼 | 有遺失刻意空白的風險 | 建議使用 |
| 為 diff 進行分段處理的設定檔 | 有壓塌結構上重要之行的風險 | 建議使用 |
| 僅含 Tab 分隔符的記錄檔 | 會將 Tab 視同空行一併移除 | 保留 Tab 行不動 |
實務上的原則是:除非您有理由以視覺方式檢視僅含縮排的行,否則請維持預設啟用。關閉此開關屬於診斷性操作,而非修飾性操作——它會保留僅含空白字元的行以供後續檢視,這在另一個工具稍後需要區分「完全空白」與「近乎空白」記錄時特別重要。
What Happens to Lines That Are Kept
每一行被保留的內容皆會被原封不動地保存。不會修剪開頭縮排、不會刪除行尾空白、不會壓縮行內連續空白,也不會改寫任何字母大小寫或標點符號。工具不會自動換行、不會排序記錄、不會去除重複值、也不會正規化 Unicode。它唯一進行的動作,就是逐行進行述詞評估,之後再按原始順序將保留的 code unit 重新組裝。這代表字元集、間距與大小寫皆會原封不動地保留至輸出中。
對於希望了解底層機制的讀者:空白字元述詞仰賴瀏覽器的 JavaScript String.trim() 實作,該實作具備 Unicode 感知能力,會將空格、Tab、非斷行空格及其他已辨識的空白字元視為可移除。相對地,嚴格述詞僅在一行完全不包含任何 code unit 時才會觸發。分割本身遵循 JavaScript String.split() 的文件行為,且 CRLF 會在單獨 CR 或 LF 之前處理,以確保列數始終可靠。
Input Limits, Errors, and Local Processing
上限為 1,000,000 個 UTF-16 code unit,這是瀏覽器記憶體與 DOM 渲染的可預期天花板。剛好達到上限的文字會被接受;多出一個 code unit 則會觸發明顯的錯誤,並且不會產生部分輸出。工具絕不對大型輸入進行抽樣、切片或靜默截斷。空白的輸入會在處理前被拒絕,以避免產生模稜兩可的報告——否則可能將「沒有文字」誤計為一個可移除的行。僅含空白字元的輸入是有效的,其結果單純取決於作用中的選項。啟用「僅含空白字元」模式時,結果會是空字串並計為一個被移除的行;採用「僅嚴格空行」模式時,該僅含空白的行則會被保留。
所有篩選、計數與輸出產生作業,皆在瀏覽器本地端完成。沒有任何上傳動作,沒有遠端 API,沒有第三方相依項目,也不接受使用者自行提供規則運算式 (regular-expression) 樣式。不會儲存任何資料,也不會有內容離開目前的分頁。若您在空白行處理之後,還需要互補的「重複行清理」,Remove Duplicate Lines 採用相同的本地處理模型,讓您能在不離開瀏覽器的情況下串接使用兩項工具。
Related Tools Worth Pairing With a Drain Removal Pass
一旦移除空白行,有幾項其他文字工具可在不重新格式化保留內容的情況下完成清理工作:
- Line Break Remover:將換行合併為單一空格或段落,同時保留所有其他字元。
- Whitespace Remover:壓縮水平間距,或移除所有空白字元(比本文介紹的空行步驟更徹底的一次處理)。
- Line Counter:針對清理後的輸出,獨立重新計算總行數、非空行與空行數量。
- Text Diff Checker:在覆寫任一檔案之前,對原始檔與清理後檔案進行逐行比對。
如需更針對特定情境的逐步教學,請參考在 Word 文件中移除空行的指南,或專門針對 Excel 的清理教學;當瀏覽器式的處理比宿主編輯器的原生指令更為迅速時,這兩份指南最後都會引導您回到此處。