在 Notepad++ 中為每一行加上引號的可靠做法,是先把清單複製起來,貼到 Add Quotes to Each Line 工具裡,選擇你實際需要的格式,再把結果以有效的 JSON、SQL、CSV 或純引號文字複製回去。當你要包圍的行內容已經包含引號、單引號或反斜線時,這個工具會處理三種不同的跳脫規則,避免讓一個快速的 Notepad++ 工作變成一場除錯惡夢。

Notepad++ 是一款很適合一次編輯一個檔案的編輯器,但它的尋找與取代對話框無法分辨哪個引號是內容、哪個引號是用來包圍的。當你的清單裡出現像 O'Brien 這類名字、已經包含雙引號的程式碼識別符,或是帶有反斜線的檔案路徑時,「前綴加後綴」的做法會悄悄產生出無效的輸出。例如 he said "hi" 這一行若用雙引號包起來,要成為有效的 JSON 必須變成 he said \"hi\",但要成為有效的 CSV 卻必須變成 he said ""hi""。同樣的輸入,兩個不同的正確答案,而正則表示式的尋找與取代對話框根本不知道該套用哪條規則。這就是為什麼大多數講解如何在 Notepad++ 中為每一行加上引號的教學文章,到了「值本身已經含有引號字元」這個情境時,都不再繼續告訴你該怎麼辦。

how to add quotes to each line in notepad ++
如何在 Notepad++ 中正確地為每一行加上引號

為什麼 Notepad++ 的尋找與取代在行內出現引號時就會失效

Notepad++ 的標準做法是按下 Ctrl+H,啟用「Regular expression」模式,把 Find what 設為 ^(.*)$,再把 Replace with 設為 "\1"。對於一份乾淨、只包含純識別符或數字的清單,這招確實會如預期運作:每一行都會被雙引號包起來。這個做法會出現在大多數教學文章中,因為在這個單一情境下它真的非常快。

這個做法會在三種特定情況下失效:

  • 值本身包含雙引號。把 he said "hi" 用雙引號包起來會變成 "he said "hi"",這在 JSON、CSV 和大多數程式語言中都是語法錯誤。尋找與取代會毫不猶豫地幫你這樣做,完全不會提醒你。
  • 值本身包含單引號。SQL 的 WHERE id IN (...) 清單會用單引號包住每個值,因此 O'Brien 必須變成 'O''Brien' 才算有效。把引號加倍是 SQL 官方記載的規則,而 Notepad++ 不會幫你自動套用。
  • 值本身包含反斜線。JSON 會把反斜線視為跳脫字元,所以 Windows 路徑 C:\new 若只是單純包起來會變成 "C:\new",JSON 解析器會把它讀成 C:<newline>。正確的輸出應該是 "C:\\new"。

這三種失敗模式有同一個根本原因:尋找與取代是一種純文字轉換,而非具備格式意識的轉換。它能在每行的開頭與結尾放上一樣的字元,但沒辦法像目標格式所要求的那樣去修改行內的內容。

決定輸出是否有效的三條跳脫規則

每一種主要的文字格式都各自定義了對於內嵌引號字元的跳脫規則,而且這些規則彼此並不一致。Add Quotes to Each Line 工具把每一種格式對應的公開標準都編碼進去了。

格式預設包圍字元內嵌引號的規則引用的標準
JSON 陣列"..."內嵌的 " 變成 \",\ 變成 \\RFC 8259
SQL IN 子句'...'內嵌的 ' 變成 ''ISO SQL、PostgreSQL、SQLite
CSV 資料列"..."內嵌的 " 變成 ""RFC 4180
反引號 / 樣板字面值`...`內嵌的 ` 和 ${ 會被跳脫JavaScript 樣板字面值規則
純引號"..." 或 '...'不做跳脫無

同一段輸入字串在不同的預設下包起來,會產生不同但都正確的輸出。把這一行 Tom's "folder" 分別用 JSON、SQL 與 CSV 預設處理,工具會分別輸出 "Tom's \"folder\""、'Tom''s "folder"' 與 "Tom's ""folder"""。在各自的目標格式中,這三個結果都不會造成語法錯誤。而 Notepad++ 的尋找與取代對這三種情況只會產生同樣一個壞掉的結果。

如何在 Notepad++ 中為每一行加上引號並做正確的跳脫

  1. 在 Notepad++ 中選取並複製清單。按 Ctrl+A 選取全部,再按 Ctrl+C 複製。如果清單是一行一項、沒有空白行,那就完全符合工具的期待。
  2. 開啟 Add Quotes to Each Line 工具。它完全在瀏覽器中執行,所以不會上傳任何資料。
  3. 把清單貼到輸入框中。每一項都必須各自佔一行。如果你的清單夾帶了零星的空白行,請把「跳過空白行」的開關保持開啟。
  4. 點選你所需格式的預設。JSON 陣列會加上外層的中括號與逗號;SQL IN 子句會加上括號與逗號;CSV 資料列會把所有內容維持在同行的雙引號包圍中;純引號則只包圍、不合併行。
  5. 視需要調整引號樣式、分隔符或跳脫設定。每一個預設也都能以個別控制項的形式調整,所以你可以變更包圍字元、強制加上結尾分隔符,或在已知安全的情境下關閉跳脫。
  6. 複製結果並貼回 Notepad++。輸出會回報處理了幾行,方便你快速確認沒有項目被遺漏。

整個來回的過程,閱讀說明的時間反而比實際操作還長。對大多數清單來說,就是複製、點一下、再點一下、再複製、再貼上一次。對於已經包含引號字元的清單,這個差別就在於輸出到底合不合用,以及接下來要除錯一個小時。

JSON、SQL、CSV 與純引號的輸出範例

假設你的清單有五行:alice、bob、O'Brien、he said "hi",以及 C:\new。

在 JSON 預設與預設設定下,工具會產出單一一行:[ "alice","bob","O'Brien","he said \"hi\"","C:\\new" ]。這可以直接貼入 JavaScript 常數、Python 的 json.dumps 測試 fixture,或測試資料檔。he said "hi" 內部的雙引號會以反斜線跳脫,C:\new 內部的反斜線則會被加倍,這正是 RFC 8259 所要求的。

同一份輸入在 SQL 預設下會產出單一一行:( 'alice','bob','O''Brien','he said "hi"','C:\new' ),可以直接貼到 PostgreSQL、SQLite 或任何符合 ISO 標準的資料庫引擎中的 WHERE id IN (...) 子句。O'Brien 中的單引號被加倍,依循的是 PostgreSQL 字彙結構所記載的字串常值規則,而 C:\new 中的反斜線則維持原樣,因為 SQL 並不把反斜線當作跳脫字元。

在 CSV 預設下,結果是同一行的單一資料列:"alice","bob","O'Brien","he said ""hi""","C:\new"。這可以直接用於試算表匯入,或符合 RFC 4180的 CSV 檔。內嵌的雙引號會被加倍,這就是為什麼 he said "hi" 會輸出為 he said ""hi""。

在純引號預設並關閉逗號分隔符時,每一行會各自被包起來、不會合併:"alice" "bob" "O'Brien" "he said "hi"" "C:\new"。這就是當你想要一份有引號的清單、而不是陣列或資料列時,會貼回 Notepad++ 的內容。純引號預設最接近 Notepad++ 尋找與取代所能給出的結果,也是兩種方法之間真的只剩速度差異的唯一情境。

重複執行、結尾逗號與其他容易踩到的陷阱

在把這個工具納入你的工作流程之前,有三個行為值得先了解。

最後一行在預設情況下不會加逗號。帶有結尾逗號的 JSON 陣列或 SQL IN 清單,對大多數解析器來說都是語法錯誤。因此預設就是不加上結尾分隔符,並提供一個切換開關,讓少數需要它的目標可以手動開啟。那些一直在手動把正則輸出中結尾逗號刪掉的 Notepad++ 使用者,應該對這個問題很熟悉。

對工具自己的輸出再執行一次會再包一層。工具無法判斷輸入中的引號到底是內容還是前一次處理的包圍結果,所以它一律當作內容來處理。對已經加上引號的輸出再執行一次,就會變成雙層包圍。如果你需要調整設定,請從原始清單開始,而不是從前一次的結果開始。

輸入上限為一百萬個字元。這個量足以涵蓋很長的 ID 清單、姓名清單和環境白名單,而且工具會以單一線性方式處理它們,因此結果會即時回傳。如果你的清單超過這個上限,可以先用 文字檔分割工具把它切成可處理的小塊。

所有處理都在你的瀏覽器內進行。這份清單通常正是那種你不太願意隨便貼到某個網站的 ID、姓名或路徑清單,而它在這裡不會被上傳、不會被儲存,也不會綁定任何帳號。這也是為什麼這個工具對正式環境資料來說是個安全的替代方案,而不只能用於佔位文字。

在 Notepad++ 與具格式意識的工具之間做選擇

有兩種情況下,純 Notepad++ 的工作流程確實是正確答案。第一種是單行的小修改:只需要包住一個值,用正則就太殺雞用牛刀。第二種是想要綁定快速鍵的反覆轉換工作,這時候 Notepad++ 的錄製巨集功能或 PythonScript 外掛會比任何瀏覽器工具更合適。

至於介於這兩者之間的所有情境,決定性的問題就在於你的清單是否包含引號字元。如果不包含,兩種做法都行,而正則那一招更快。如果包含,那麼 Add Quotes to Each Line 工具會是比較安全的預設選擇,因為它所套用的跳脫規則,正是另一端的解析器會去檢查的那些規則。Notepad++ 中不使用正則的做法是個有用的折衷選項,如果你需要在編輯器內部完成工作;而貼回修正指南則逐步示範了同一工作流程在編輯器那一側的版本。

情境Notepad++ 正則做法Add Quotes to Each Line
純 ID 或數字,沒有內嵌引號快速,一個快速鍵兩次點擊
含有內嵌引號的名稱或路徑會產出無效輸出會產出有效輸出
同一工作階段中混合 JSON、SQL、CSV 目標需要手動重新編輯每種格式各點一次
敏感的正式環境資料保留在磁碟上在本機瀏覽器執行,絕不上傳

這個比較的目的不是在說瀏覽器工具全面勝出。重點在於,Notepad++ 的正則是一種文字轉換,而一件帶有規則的「把東西包上引號」工作,其實是另一種層次的問題。一旦你接受「規則本身就是產品」,那麼挑選一個把規則編碼在內的工具,就是那個聽起來無聊、但其實正確的選擇。