為每一行加上前綴,指的是在一整段文字裡,每一行的開頭都放上完全相同的字元;加上後綴,則是放在每一行的結尾——這兩個動作都是逐行、依序進行的,不會動到那一行原本已有的內容。對初學者來說,這個概念很簡單,但真正動手做的時候,問題就會冒出來。傳統記事本風格的「尋找與取代」也能用正規表示式完成同樣的工作,但正規表示式會把 $、(、)、\ 這類字元當成特殊符號,所以只要你的前綴裡含有一個左括號或反斜線,結果就會在你不知情的狀況下出錯。線上編輯器會把格式去掉,文書處理軟體會自動套用自己的校正,試算表匯出則會把換行符號搞亂。一個專為「字面前綴與後綴插入」設計的瀏覽器工具,能完全避開這些問題:你的前綴會逐字、逐行地被原樣插入,括號和錢字符號也不例外。這篇教學會說明這項操作實際上在做什麼、為什麼手動方法在常見標點符號上會失敗,以及如何用為每一行加上前綴與後綴,分三個簡單步驟為每一行加上前綴。

「為每一行加上前綴」實際上代表什麼
初學者常常把前綴想像成某種很特別的東西,但它其實就只是一小段被加在每一行開頭的字元。如果你的文字是:
applebananacherry
而你的前綴是 FRUIT-,結果就會是:
FRUIT-appleFRUIT-bananaFRUIT-cherry
後綴在結尾的運作方式一樣。當兩者都設定好之後,每一行都會變成前綴 + 原始行內容 + 後綴。這就是全部的規則。
這個工具不會重新排列行的順序,不會把行內的空白正規化,不會改變英文字母大小寫,不會去除標點符號,也不會把你的前綴當成一種模式來解讀。它只會把前綴放在每一行前面、後綴放在後面。行的順序和原始行內容都會完全依照你輸入的樣子保留下來,這代表一行原本開頭就有的空格,也會原封不動地保留著。
一個簡單的數字示範,能讓結果變得容易預測。如果你的輸入有 50 行,每行平均 20 個字元,那麼輸入就是 50 × 20 = 1,000 個字元。為每一行加上一個 ITEM-(5 個字元)的前綴,會增加 50 × 5 = 250 個字元,最終結果會是 1,250 個字元。這也是為什麼這個工具 1,000,000 字元的輸入上限很容易事先規劃:你可以用(行數 × 前綴長度)+(行數 × 後綴長度),加上原始輸入大小,來估算最終大小。
為什麼初學者用手動方法會卡關
初學者最常踩到的陷阱,就是「尋找與取代」視窗。按下 Ctrl+H,把 ^ 替換成類似 > ( 這樣的內容,聽起來很合理,但 ^ 符號其實是正規表示式裡代表「行首」的錨點符號——不是字面上的插入符號字元。同樣地,$ 比對的是「行尾」,不是錢字符號,而 ( 則會開啟一個擷取群組。只要你的前綴裡包含括號、錢字符號、反斜線、星號或直線符號,結果就不再是你輸入的樣子了。
文書處理軟體也沒有比較安全。把「>> 」貼進 Microsoft Word 或 Google Docs,預設就會去掉開頭的空格、把看起來是空白的行合併在一起,還會套用自動校正,把直引號變成彎引號。自動格式化,會在你不知情的狀況下,悄悄改寫掉你原本想保留的那些字元。
試算表匯出還會帶來第三個問題:換行符號。Windows 檔案用 CRLF,較舊的 Mac 檔案單獨用 CR,Unix 檔案則用 LF。一個只認得 LF 的工具,看起來會把你的輸入「合併」在一起;而一個只認得 CRLF 的工具,則會在輸出裡留下多餘的 CR 字元。CRLF、CR 與 LF 都會被辨識出來,並在產生的輸出裡統一正規化成 LF,所以一份從 Windows 貼上的檔案,和一份從 Mac 貼上的檔案,會得到相同的結果。
這個以瀏覽器為基礎的工具,完全避開了上述三個問題,因為前綴與後綴都是字面字串。像括號、引號、錢字符號、反斜線、星號與括號這類字元,都會依照輸入時的樣子被原樣插入;它們不會被當成正規表示式、替換標記、Markdown、HTML 或程式碼來解讀。對清單標記、引號、分隔符號、SQL 片段、記錄標籤、shell 註解,以及簡單的資料整理來說,這讓整個轉換過程變得可以預測。
如何用三個步驟為每一行加上前綴
以下是實際操作的教學。這個工具完全在你的瀏覽器裡執行,所以不會上傳任何內容。
- 貼上或輸入你想加上裝飾的行。把你的清單放進輸入框裡。純文字、電子郵件簽名檔、程式碼行,以及記錄項目,處理方式都一樣。最多可接受一百萬個字元,對非常長的檔案來說也綽綽有餘。
- 輸入前綴、後綴,或兩者都輸入。把前綴輸入到前綴欄位,把後綴輸入到後綴欄位。每一個都限制在 200 個 Unicode 字元以內。如果你只需要前綴,就把後綴欄位留空,反之亦然。兩者之中至少要有一個不能是空的,因為產生一份和輸入一模一樣的結果,不會帶來任何價值。使用提供的選項,決定空白行是否應該保持不變。
- 產生結果、檢查預覽,並下載 UTF-8 的 TXT 檔案。點選產生按鈕。預覽畫面會在一個保留格式的區域裡,顯示出確切的輸出字串,並保留空格與換行。看起來沒問題之後,把結果下載成一份標示為 UTF-8 的純文字檔案,不含位元組順序記號,也沒有多餘的格式。編輯輸入內容、前綴、後綴,或空白行設定,都會清除舊的結果,並讓它的下載連結失效,所以這個檔案永遠反映的是你目前的設定。
如果你想要一份實用的參考,收錄初學者常遇到的前綴與後綴模式,前綴速查表把最常用的範例都整理在同一個地方。
初學者常見情境,以及該輸入什麼
下表整理了初學者最常詢問的情境,以及應該在每個欄位輸入的字面文字。每一列都完全照著顯示的內容,使用前綴與後綴欄位。
| 情境 | 前綴 | 後綴 | 單行結果 |
|---|---|---|---|
| 電子郵件回覆引用標記 | > | (留空) | > Thanks for your note. |
| Markdown 項目清單 | - | (留空) | - Buy milk |
| Bash 或 shell 註解 | # | (留空) | #!/bin/bash |
| 記錄嚴重性標籤 | [INFO] | (留空) | [INFO] server started |
| 用單引號包住每個 ID | ' | ' | 'A123' |
| SQL 字串字面值清單 | ' | ', | 'apples', |
| HTML 清單項目 | <li> | </li> | <li>bread</li> |
| JavaScript 單行註解 | // | (留空) | // initialize counter |
請注意,每一列都把前綴與後綴當成純文字處理。SQL 那一列裡的單引號,維持是單引號;[INFO] 裡的括號,維持是括號;// 裡的斜線,維持是斜線。沒有任何逸出處理、沒有特殊標記,也沒有任何 Markdown 解讀——每一行的輸出結果,就剛好是前綴 + 原始行內容 + 後綴。
這個工具不會做的事
了解這個工具的邊界,和了解它的功能一樣重要,對可能會假設它也能處理相鄰任務的初學者來說尤其如此。
前綴與後綴是逐字插入的;這個工具不會在行內尋找並取代文字。如果你需要在每一行修正一個拼錯的字,正確的工具是尋找與取代。它不會為各行加上依序遞增的編號——如果需要這個功能,Add Line Numbers 是專門的選項。它不會剖析 CSV 欄位、不會編輯 Word 文件,也不會推斷語法。如果你需要試算表所預期的 CSV 風格加引號方式(含逗號與逸出過的引號),Add Quotes to Each Line 會自動套用該格式專屬的逸出規則。
還有兩個細節,對第一次使用的人來說很重要。這個工具不會裁剪一行的開頭或結尾、不會壓縮行內的空格、不會改變英文字母大小寫、不會移除 Tab、不會排序項目,也不會去除重複值。當「跳過空白行」開啟時,一行只含空格的內容,會連同那些空格一起原封不動地保留下來。編輯輸入內容、前綴、後綴,或空白行設定,都會清除舊的結果,並讓它的下載連結失效。空白輸入與超出上限,都會產生明顯可見的錯誤訊息。如果下游格式有自己的逸出規則,請針對那個格式另外驗證或處理逸出,因為這裡下載到的是一份純文字檔案,不含試算表加引號規則、不含 CSV 逸出規則、不含由檔名衍生出的前綴,也不會自動偵測分隔符號。
新手上路的小提醒,讓第一次使用更順利
三個好習慣,能讓第一次使用更乾淨、結果更可預測。
第一,下載之前一定要先預覽。這個保留格式的預覽區域,會精確保留空格與換行,畫面上的自動換行,並不會在檔案裡加入真正的換行符號。你在預覽裡看到的內容,就是下載檔案裡實際包含的內容。
第二,在點下產生之前,先決定好空白行的處理政策。開啟「保留空白行不變」時,空字串和只含空白的行,都會完全維持原樣。關閉這個選項時,每一個邏輯行都會被加上裝飾,包括空行與只含空白的行在內。這個選擇會改變最後一行的行為:結尾的換行符號,會產生最後一個空的邏輯行,而這一行會不會被加上前綴與後綴,就取決於你選擇的設定。
第三,記得每個加綴文字都有 200 個 Unicode 字元的上限。如果你的前綴需要更長——比方說一段很長的 SQL 註解標頭——可以把工作拆成兩次處理,或把前綴精簡到最核心的部分。整個處理過程完全在瀏覽器裡執行,所以即使是大型的轉換也能保持流暢反應,文字也絕不會被上傳出去。表情符號與非拉丁文字都能直接插入,不需要額外步驟,因為這項操作使用的是 JavaScript 字串,而產生出來的檔案也標示為 UTF-8 純文字。
為什麼「字面」這件事比聽起來還重要
「字面」這個詞,在前面每一段裡都在發揮實質作用,值得說清楚為什麼。一個字面前綴,就是一個逐字被貼進去的前綴,在你輸入的內容與輸出結果之間,沒有任何解讀層介入。一旦出現任何解讀層——即使是立意良善的那種——這個工具就得替你做決定,而那些決定不見得符合你的原意。
以前綴 $(date) 為例。對一個 shell 使用者來說,這看起來像是命令替換的佔位符;但對一個正規表示式引擎來說,括號是一個擷取群組,錢字符號則是一個反向參照。對一個 Markdown 渲染器來說,錢字符號代表數學模式。對 HTML 處理來說,它們本身沒有任何意義,但附近如果有一個 <,就可能觸發標籤剖析。一個把 $(date) 當成字面字串處理的工具,只會單純在每一行的開頭輸出 $(date),也就是使用者輸入的內容。一個會去解讀它的工具,則會產生好幾種其他結果,沒有一種是使用者原本要的。
同樣的道理,也適用於中括號、星號、反斜線、直線符號與大括號。這些字元,每一個至少在某一種常見的文字處理系統裡,都是特殊字元。一個字面插入工具,完全繞開了這整個問題,因為你前綴裡的任何字元都不特殊。每一行的輸出結果,剛好都是前綴 + 原始行內容 + 後綴,並以 LF 連接起來,而預覽畫面顯示的字串,就是下載檔案裡會包含的那個字串。
為每一行加上前綴,正是那種在你動手用文字編輯器試過、眼睜睜看著自己的標點符號消失之前,看起來小到不值得動用工具的任務。有了一個把你的前綴與後綴當成字面字串處理的瀏覽器工具,這項操作就變成一套乾淨的三步驟流程,任何初學者都能重複執行。貼上這些行,輸入前綴或後綴,再下載 UTF-8 文字檔案。結果會保留每一個原始字元、每一個原始空格,以及你一開始的行順序。
如果你還在猶豫該怎麼選,在 Notepad++ 裡為每一行加上引號,適用於 JSON、SQL、CSV一文有更詳細的說明。