在 Mac 上為每一行加上前綴,意思是將一段最多 200 個 Unicode 字元的字面字串,串接到你文字中每個邏輯行的開頭,而且不需要正規表示式、跳脫字元,也不重新格式化原始內容。在 Mac 上,你有幾種原生選項可以完成這項工作:TextEdit 的尋找與取代、Terminal 的 sed 與 awk、BBEdit 的多行 grep,或是 VS Code 的多重游標技巧。這些方法都能用,但每一種都帶有一點操作上的負擔,例如 sed 的正規表示式語法、VS Code 的字元類別跳脫,或是 TextEdit 有限的尋找框。一個以瀏覽器為基礎、把你的前綴當作純字串處理、保留你的行序與空白、並輸出 UTF-8 TXT 檔案的工具,會是最簡單的做法,當你需要可預期的結果,又不想切換到其他應用程式時。《Add Prefix and Suffix to Lines》工具正是這樣做的,而且它完全在你的瀏覽器中執行,這代表你的資料從不離開你正在使用的這台機器。

add prefix to each line on mac
在 Mac 上為每一行加上前綴,不使用 sed

Mac 使用者通常最先會選擇的工具

macOS 上有三條內建的路徑可以為每一行加上前綴,每一條都出現在網路上的教學文章中。TextEdit 可以透過「尋找與取代」搭配「插入樣式」選項來完成,但那個欄位要求你跳脫字面字元並使用擷取語法,這讓一個簡單的前綴顯得比實際情況更複雜。Terminal 的 sed 's/^/PREFIX/' file.txt 是經典指令,也能正常運作,但你必須記住哪些字元需要跳脫(斜線、& 符號、反斜線),而且這個指令會把你的前綴當作正規表示式樣式來處理。macOS 上的 VS Code 支援多重游標快速鍵 Cmd+Option+Down,在每個選取行的開頭放下游標,對於較短的檔案來說確實快速;但要注意的是,你必須了解「軟」換行與「實體」換行之間的差異,而且你必須為每個游標手動輸入前綴。

這些方法每一種都能用。它們的摩擦點都一樣:你輸入的前綴會被解讀成別的東西。sed 的正規表示式、TextEdit 的擷取樣式,甚至 BBEdit 的巨集錄製,都在你與你真正想要的字面字串之間多加了一層。當你在裝飾一份 SQL 識別項清單、建立 Markdown 核取方塊,或是把每一行包進 JSON 引號時,可預期性比原始速度更重要。

Mac 上的一種字面替代方案

《Add Prefix and Suffix to Lines》工具把前綴與後綴視為純字串。方括號、錢號、反斜線、星號、括號與引號都會照你輸入的方式插入,不會有正規表示式取代符號,也不會經過 Markdown、HTML 或程式碼的解讀。這讓結果對 SQL 片段、shell 註解、清單標記、記錄標籤,以及簡單的資料準備工作來說都是可預期的。

你可以把最多一百萬個字元貼到瀏覽器中,在專屬欄位輸入前綴(以及選擇性的後綴),選擇是否要為空白行加上裝飾或略過,工具就會在保留空格與換行的預覽中產生精確的結果。接著你可以把輸出下載為 TXT 檔。轉換會使用 JavaScript 字串在你的瀏覽器中本地執行,可下載的檔案則是以 UTF-8 純文字 Blob 建立,所以沒有伺服器往返,也沒有上傳步驟。

如何在 Mac 上為每一行加上前綴

  1. 在你的 Mac 上用 Safari、Chrome 或任何瀏覽器開啟這個工具,把你想要裝飾的行貼上(或輸入)到輸入區域中。
  2. 在前綴、後綴或兩者各自的欄位中輸入內容。每個欄位最多接受 200 個 Unicode 字元,包含表情符號與非拉丁文字。如果你希望空白行或只有空白的行保持原狀,請切換「保留空白行不變」。
  3. 在預覽中讀取產生的結果以確認看起來正確,然後點擊下載按鈕儲存一個標示為 UTF-8 的 TXT 檔。

對輸入、前綴、後綴或空白行設定的編輯會自動清除舊的結果並撤銷其下載 URL,因此在你更改輸入之後,過時的結果無法被儲存。

你應該知道的 Mac 行尾行為

macOS 上的文字檔案,行尾符號歷史上與 Windows 或 Linux 共用的檔案不同。經典 Mac 檔案單獨使用 CR(歸位字元,\r);Windows 使用 CRLF(\r\n);而 Unix、Linux 與現代 macOS 使用 LF(\n)。如果你從 Word 文件或是在 Windows 匯出的 CSV 中複製文字,你的「行」可能會以 CRLF 分隔,單純的行數計算或正規表示式會因此出錯。

《Add Prefix and Suffix to Lines》工具在把你的輸入分割成邏輯行時,能辨識全部三種分隔樣式——CRLF、CR 與 LF——然後在產生的輸出中一致地以 LF 接回。這代表你可以從任何來源貼上文字,而你下載的檔案每一行都會有相同的換行符號,這正是大多數下游編輯器與建置系統所期待的。

有一個值得了解的細節:輸入中結尾的換行會產生最後一個空的邏輯行。如果「保留空白行不變」是開啟的,那個結尾的行在輸出中會保持空白;如果它是關閉的,結尾的行就會被加上前綴與後綴。這個行為是刻意的,如此結果才不會悄悄遺失輸入中所代表的最終行邊界。當這個選項啟用時,空字串與只包含空白的行都會原樣回傳,因此只有空格的行不會被裝飾,它的空格也不會被移除;此處的空白處理遵循文件化的 String trim 語意,但只有在略過選項開啟時才會參考。

Mac 使用者會為哪些任務裝飾行

同樣的操作——串接前綴 + 行 + 後綴——涵蓋了 Mac 上令人驚訝廣泛的日常工作。下表列出這個工具所設計的情境,以及你應該輸入的前綴(以及在適當位置的後綴)。

任務前綴後綴為何字面很重要
Shell 註解區塊# (無)不需要為 # 或空格進行跳脫。
Markdown 項目符號清單- (無)短橫線與空格會原樣出現。
Markdown 核取清單- [ ] (無)方括號會以字元插入,而非正規表示式群組。
SQL IN 清單''兩個引號都是字面;值中的 $ 保持不變。
JSON 陣列值""安全地包住識別項;逗號由使用者另外加上。
記錄前綴標籤[INFO] (無)方括號不會被解讀為字元類別。
HTML 類別名稱class=""引號原樣插入,不執行 HTML 跳脫。

對於數字前綴(1.、2.、3.、……),專門的 Add Line Numbers to Text 工具會一次處理起始偏移、補零與分隔符號。對於需要正確 JSON、SQL 或 CSV 跳脫的引號包裹,《Add Quotes to Each Line》工具會套用每種格式實際要求的跳脫規則。

這個工具刻意不做的事

了解這個工具不是設計來做哪些事,能避免你拿錯工具。前綴與後綴絕不會被解讀為正規表示式、取代符號或樣板語法,所以 $1 或 \d 會以字面字元 $、1、\、d 出現在你的輸出中。這個工具不會修剪行的開頭或結尾、不會收縮內部空白、不會改變字母大小寫、不會移除 tab、不會排序項目,也不會去除重複值。一個只包含單一空格的行會保持為只包含單一空格的行,不會被更動,除非你關閉「保留空白行不變」選項,讓只有空白的行也被裝飾。

預覽會在一個保留空格與換行、但允許視覺上長行換行的預先格式化區域中呈現;這種視覺換行純粹是裝飾性的,不會在你下載的檔案中加入真正的換行。可下載的檔案包含以 UTF-8 純文字產生的字串,沒有位元組順序標記、沒有富文字樣式、沒有試算表引號,也沒有自動分隔符號偵測。如果你需要 CSV 安全的跳脫,或是下游系統需要的 BOM,請另外驗證或跳脫結果。這個工具也不會加入連續編號、不會剖析 CSV 欄位、不會編輯 Word 文件,也不會推斷語法。

何時 Mac Terminal 指令是更合適的選擇

對於非常大的檔案,或是你在建置腳本中執行的可重複工作,在 macOS 上使用 sed -i '' 's/^/PREFIX/' file.txt 很難被超越。-i 後面那對空引號是 Mac 上 BSD sed 的慣例,用來防止它寫入備份檔。當你想要一個沒有正規表示式的字面前綴、不想在 Mac 鍵盤上輸入跳脫序列、想要最後得到一個 UTF-8 TXT 檔案而非就地編輯,或需要處理來自 Windows 來源的 CRLF 輸入而不想手動預處理時,本文介紹的工具會是更合適的選擇。如果你發現自己反正還是把文字複製到瀏覽器,瀏覽器這一步很短,結果是一個你可以在儲存前先驗證的檔案。

若想進一步了解為何字面插入與正規表示式取代屬於不同的類別,請參閱《Add a Prefix to Each Line Without Regex or Escaping》。若想更完整地比較這個瀏覽器工具與原生 macOS 應用程式及 Terminal,請參閱《Add Prefix and Suffix to Lines: The Browser Alternative》。