記事本刪除重複行

記事本刪除重複行

如何刪除notepad++中的重複行?我看到了一些例子,但很多已經有很多年了,解決方案現在不起作用。

影像

假設我有:

Example
Example
1
1
3

期望:

Example
1
3

我在 32 位元 notepad++ 或 TextFx Tools 中似乎沒有插件管理器

答案1

我提供了幾種可能的解決方案供您考慮。如果我重複了您已經知道的任何內容,請原諒我。 =)

長話短說

從 Notepad++ v7.7.1 開始,Notepad++ 有一個名為刪除連續的重複行它與下面給出的其他兩個解決方案執行相同的操作(即刪除連續的重複行)。

可以透過以下方式存取它編輯 → 行操作 → 刪除連續的重複行


巴特比的回答下面是一個正規表示式的範例,該表達式將刪除重複行而不進行排序。


原答案

根據 @máté-juhász 的評論,對此已接受的答案堆疊溢位問題將使用您的範例資料。

在本質上:

  • 打開搜尋 → 取代...Notepad++ 中的( Ctrl+ )。H

  • 在「尋找內容:」欄位下,輸入以下內容正規表示式:

     ^(.*?)$\s+?^(?=.*^\1$)
    
  • 將「替換為:」欄位留空,並確保在「搜尋模式」選項下標記「正規表示式」。

  • 準備好刪除線條後,按一下「全部替換」。

請注意,原始答案似乎表明. matches newline應該選中該選項,但評論中的某些人顯然沒有選中它會運氣更好。對於你的數據,我沒有對其進行檢查,它似乎運作良好。

前任。使用正規表示式

正規表示式替換範例


使用uniq

作為替代方案,假設沒有其他選項可以滿足您的需求,如果您有基於 Unix 的 Windows 端口獨特的實用程序,您可以使用 Notepad++ 將其整合到您的工作流程中。

簡而言之,uniq執行與上面的正規表示式相同的功能,但以可能更可靠的方式。缺點是,將它與 Notepad++ 結合起來有點麻煩。考慮到這一點,如果您想嘗試一下,下面概述了基本步驟。

獲取唯一性

首先,您需要一份uniqWindows 版的副本。您可能有多種選擇,但為了簡單起見,我可能會建議GnuWin32 CoreUtils 套件包括uniq。您目前可以下載一個輕量級安裝程序如果您選擇不自行下載和組合 CoreUtils 軟體套件元件的壓縮版本。

作為提示,對於涉及 的解決方案中的每一步uniq,我都會跳過使用帶有空格的路徑。 Unix 通常以與 Windows 不同的方式處理目錄名稱中的空格,因此從該環境移植的實用程式可能會出現問題。


作為參考,我不確定什麼(如果有)檔案大小限制可能適用於 的 GnuWin32 版本uniq,但我經常輕鬆地將它用於具有至少幾兆資料(通常是幾十萬行)的文字檔案。


將 uniq 與 Notepad++ 一起使用

安裝後uniq,將類似以下行的內容放入批次檔中:

C:\path\to\uniq.exe %* > C:\temp\uniq_tmp.txt
notepad++ C:\temp\uniq_tmp.txt
exit()

將此批次檔保存在您喜歡的永久目錄中。出於參考目的,我將其稱為uniq_npp.bat。請注意,「temp」可以是任何資料夾,但「tmp」和「temp」通常已經存在於 Windows 上。同樣,「uniq_tmp.txt」可以是您想要的任何名稱,只要使用一致即可。

儲存後uniq_npp.bat,然後我們準備將其功能整合到 Notepad++ 中。為此,請開啟 Notepad++跑步...選單 ( F5) 並在出現的欄位中輸入類似以下內容的內容:

cmd /k C:\path\to\uniq_npp.bat "$(FULL_CURRENT_PATH)"

如果您按一下最左側的「執行」按鈕,您可以在儲存之前測試您的 Notepad++ 命令。

前任。運行...對話框

運行對話框範例

否則,請按一下“儲存...”並適當地命名您的命令。如果您願意,可以給它一個鍵盤快捷鍵,但這不是必需的。點擊“確定”保留您的命令設定並將其放置在跑步...下拉式選單供以後使用。

前任。運行下拉式選單

運行選單條目範例


uniq假設您對此感興趣,我在本答案末尾的“註釋”部分對該解決方案的工作原理進行了非常簡短的概述。


注意事項

關於此解決方案需要記住的一件重要的事情uniq是,它絕對需要儲存在磁碟上的檔案的路徑(該文件無法僅在 Notepad++ 中開啟)。

對於您已開啟的現有文件來說,這不是問題,但如果您建立新文件或更改現有原始文件,則需要節省在運行你的之前先它uniq_npp.bat文件。否則,操作將失敗並且任何新資料都不會被排序。

作為一個小優勢,可能值得一提的是,此保存限制不適用於上面的正規表示式選項。


筆記

排序

提供的解決方案(即初始正規表示式 和uniq)都需要將重複的行直接出現在另一行上方,然後將其刪除,例如:

duplicate line X
duplicate line X

這意味著在應用這些操作之一之前對資料進行排序非常重要。我假設您已經根據範例資料執行了此操作,但無論如何還是值得一提。

Notepad++ 巨集

作為一個小建議,由於 Notepad++ 的內建行排序操作沒有任何實際的鍵盤快捷鍵,因此您可能需要錄製一個巨集來幫助排序。特別是,您可以錄製編輯→全選( Ctrl+ A) 操作,然後選擇其中一項編輯→行操作→依字典順序對行進行排序選項。

對於uniq解決方案,也可能值得考慮將「儲存」操作記錄為排序巨集的最後一步。另請注意,正規表示式選項的步驟(開啟「取代」對話方塊、輸入正規表示式等)也可以記錄到方便的巨集中。

uniq 解決方案的工作原理

簡單來說:

  • 「運行...」行會產生一個命令視窗 ( cmd /k),調用uniq_npp.bat並為其提供儲存您選擇的當前文件的路徑。

  • uniq_npp.bat,該路徑是透過%*傳遞給 的通配符捕獲的uniq。然後,刪除重複的資料uniq被重定向 ( >) 到「uniq_tmp.txt」。

  • 最後,批次檔在新的 Notepad++ 標籤中開啟此清理後的文本,並透過 關閉命令視窗exit()

uniq_npp.bat 改進(?)

關於排序,另一個選擇是跳過使用 Notepad++ 對所有內容進行排序。在有關排序選項的過程中,您可能會失去一些彈性,但您可以透過以下方式將項目排序作為批次檔中的額外步驟:Windows排序命令。要新增這一步,可以修改第一行uniq_npp.bat如下:

sort %* | C:\path\to\uniq.exe > C:\temp\uniq_tmp.txt

這只是將排序後的資料從管道傳輸sortuniq。如您所見,sort現在最初捕獲數據路徑,而不是uniq.

另一個想法是(可能)使用%*通配符作為字串操作的一部分來獲取原始文件名,並將例如“uniq_tmp.txt”替換為“original-filename_uniq.txt”之類的內容,以使其更加... ....獨特。

潛在的陷阱

  • 預設情況下,Windowssort會將數字排序為例如

     1
     11
     2
     21
    

如果它們前面沒有 0(例如01, 02, 011, 021)。

  • 雖然 GnuWin32 CoreUtils 軟體包確實附帶了Unix排序實用程式(它比 Windows 具有更強大的選項sort),這個特定的實作(與大多數 GnuWin32 實用程式不同)讓我覺得在 Windows 上有點差。但是,如果您使用 Unix 版本的不同 Windows 端口sort,則此問題可能不適用,並且總體上可能被證明是更好的選擇。

答案2

我發現這對於不按順序排列的項目非常有效:

搜尋: (?s)^(.*?)$\s+?^(?=.*^\1$)

按一下“全部替換”,“替換為:”欄位中不包含任何內容。

編輯:

這是一步一步:

(?s) 點也符合換行符號。

^ 行首

(.*?)$ 透過非貪婪地匹配零個或多個任意字元直到遇到第一個行尾來建立第一個捕獲組。

\s+?非貪婪地匹配一個或多個空白字符

^ 行首(再次)

(?= 非捕獲組的正向前瞻(此模式必須匹配,但不儲存)。

.*^\1$) 貪婪地匹配零個或多個字符,一直持續到整個行與第一個捕獲組匹配的新行。

因此,正規表示式建立一個捕獲組,然後搜尋文件中的所有行,直到找到與該行精確匹配的行,並將原始行替換為空。

附錄:我當時沒有想到這一點,我向正規表示式的創建者道歉,但我相信史考特是正確的,因為我使用的是其他人創建的正規表示式的稍微修改過的版本。如果我要猜測它的起源,我認為它可能更有可能是他給出的連結中實際記入的答案,可以找到這裡

最後,請接受我的歉意:

  1. 沒有給予應有的信用。我當時沒有想到,但我應該想到的。
  2. 沒有完全解釋我提供的答案,這會增加人們對正在發生的事情的理解,因此他們可能能夠使用這些資訊來解決其他問題。
  3. 沒有更快地回复斯科特的評論。我對這個網站的使用不是很專家(因此我的分數很低),直到今天才想到檢查我的通知。

我錯了!

答案3

謝謝,但是 regex 和 uniq 只偵測到彼此相鄰的重複行。使用此 awk 腳本代替 awkuniq-npp.bat,它與 Notepad++ 相容。 4行bat檔:

C:\pathto\awk.exe '(a[$0]++==0)' %* > %*.1
刪除%*
移動 %*.1 %*
出口()
運行命令:

cmd /k C:\pathto\awkuniq-npp.bat "$(FULL_CURRENT_PATH)"

它在 del/move 後使用自動重新加載來替換相同的檔案名

答案4


我使用以下搜尋/替換正規表示式(對行進行排序後),我發現它更直觀地理解:

Find: (.*)\r?\n(\1\r?\n)+

Replace with: \1\r\n

說明:
- 尋找「任何內容」(一行文字),後面跟著一個新行(\n 或 \r\n): 。\r?\n
- 將行的內容保存在變數中:(.
)\r?\n
- 尋找同一行重複出現一次或多次:(.*)\r?\n(\1\r?\n)+

替換: - 僅用該行本身和新行替換上述所有內容: \1\r\n

希望有幫助,
sb3k

相關內容