Notepad ++ thay thế dần dần


83

Giả sử tôi muốn có 10 hàng dữ liệu nhưng tôi muốn giá trị tăng dần cho mỗi hàng hoặc phần dữ liệu. Làm cách nào để tăng giá trị đó?

Ví dụ .... Nếu tôi có các hàng này, có cách regex nào để thay thế các giá trị id để tăng lên không?

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

--- Đây là những gì tôi muốn nó trông như thế nào ... (nếu id của hàng đầu tiên tăng lên một cái thì được)

<row id="1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5" />

Notepad ++ thay thế không giải toán, cũng không phải regex.
Amber

Nếu có thể thì khó vô cùng. Không có khái niệm số trong biểu thức chính quy (vì vậy không có +1) và không có cách nào dễ dàng để tích lũy dữ liệu khi bạn khớp với một regex (vì vậy không có kết quả khớp "tiếp theo"). XSLT có thể giúp bạn ở đây, nếu bạn thực sự cần phải tự động hóa việc này.

@Amber Notepad ++ có chức năng regex hạn chế.
Karolis

@Karolis Tôi rất biết điều đó. Tôi chỉ đơn giản nói rằng không phải regex (bẩm sinh) và việc triển khai tìm kiếm và thay thế của Notepad ++ bằng cách sử dụng regex đó, đều không hỗ trợ toán học cho các thay thế.
Amber

1
Mặc dù regex đã được đề cập (và được gắn thẻ) như một phương pháp khả thi, OP dường như ít quan tâm đến phương pháp cụ thể hơn là chỉ biết liệu Notepad ++ có thể thực hiện nhiệm vụ hay không .... câu trả lời của voithos giải quyết hoàn hảo.
jbobbins

Câu trả lời:


155

Không chắc chắn về regex, nhưng có một cách để bạn làm điều này trong Notepad ++, mặc dù nó không linh hoạt cho lắm.

Trong ví dụ bạn đã đưa ra, hãy giữ Altvà chọn cột số bạn muốn thay đổi. Sau đó, truy cập Edit->Column Editorvà chọn Number to Insertnút radio trong cửa sổ xuất hiện. Sau đó chỉ định số ban đầu và gia số của bạn, và nhấn OK. Nó sẽ viết ra các số tăng dần.

Lưu ý: điều này cũng hoạt động với Multi-editingtính năng (chọn một số vị trí trong khi vẫn Ctrlnhấn phím).

Tuy nhiên, điều này không phải ở bất kỳ đâu gần tính linh hoạt mà hầu hết mọi người sẽ thấy hữu ích. Notepad ++ là tuyệt vời, nhưng nếu bạn muốn một trình soạn thảo thực sự mạnh mẽ có thể thực hiện những việc như thế này một cách dễ dàng, tôi muốn nói hãy sử dụng Vim.


4
+1 cho cả tính năng cột tối nghĩa và lưu ý rằng vim là một trình soạn thảo mạnh mẽ hơn. ;)
Spencer Rathbun

Notepad ++ thật tuyệt vời, sẽ thật tuyệt nếu chúng ta có một trình soạn thảo văn bản trực tuyến mạnh mẽ như trình này.
Luiz Feijão Veronesi

1
Đối với tôi là: chọn cột bằng Alt + Shift và sau đó thực hiện Số để chèn. Hoạt động hoàn hảo
Rombus

Cảm ơn! Tính năng này là tuyệt vời. Ngoài ra, tôi có thể chọn cột bằng cách nhấp đúp vào nó.
Rahim Khoja

Tuyệt vời! Chỉ cần đã cứu sống tôi khi phải chuẩn bị 300 báo cáo chèn,
donut

14

Tôi đã tìm kiếm tính năng tương tự ngày hôm nay nhưng không thể thực hiện điều này trong Notepad ++. Tuy nhiên, chúng tôi có TextPad để giải cứu. Nó đã làm việc cho tôi.

Trong hộp thoại thay thế của TextPad, bật regex; sau đó bạn có thể thử thay thế

<row id="1"/>

bởi

<row id="\i"/>

Hãy xem liên kết này để biết thêm các tính năng thay thế tuyệt vời của TextPad - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/


1
Tôi đoán nó sẽ hữu ích nếu tôi thực sự chú ý. Đã kết thúc cài đặt SublimeText. :) Cảm ơn.
rtf

1
Nhưng hãy chắc chắn rằng bạn nhấn nút "Replace All". "Thay thế tiếp theo" sẽ không tăng bộ đếm. Phải mất hàng giờ để tìm ra điều này. \ i Thay bằng các số bắt đầu từ 1, tăng dần 1. \ i (10) Thay bằng các số bắt đầu từ 10, tăng dần 1. \ i (0,10) Thay bằng các số bắt đầu từ 0, tăng dần 10. \ i ( 100, -10) Thay bằng các số bắt đầu từ 100, giảm dần -10.
Venkatesh Muniyandi

8

tôi đã gặp vấn đề tương tự với hơn 250 dòng và đây là cách tôi đã làm điều đó:

ví dụ :

<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />

bạn đặt con trỏ ngay sau "1" và bạn nhấp vào alt + shiftvà bắt đầu giảm dần bằng mũi tên xuống cho đến khi chạm đến dòng dưới cùng, bây giờ bạn thấy một nhóm lựa chọn nhấp vào xóa để xóa đồng thời số 1 trên mỗi dòng và đi tới Edit -> Column Editorvà chọn Number to Insertsau đó đặt 1vào trường số ban đầu và 1tăng dần theo trường và kiểm tra các số 0 và nhấp vàook

Xin chúc mừng bạn đã làm được :)


5

Vì có giới hạn câu trả lời thực nên tôi sẽ chia sẻ cách giải quyết này. Đối với những trường hợp thực sự đơn giản như ví dụ của bạn, bạn làm ngược lại ...

Từ đây

1
2
3
4
5

Thay thế \r\nbằng " />\r\n<row id="và bạn sẽ đi được 90% chặng đường ở đó

1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5

Hoặc là một cách tương tự, bạn có thể hack về dữ liệu bằng excel / bảng tính. Chỉ cần chia dữ liệu ban đầu của bạn thành các cột và thao tác các giá trị khi bạn yêu cầu.

|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |
|   <row id="   |   1   |   " />    |

Những thứ rõ ràng nhưng nó có thể giúp ai đó thực hiện công việc hack một lần duy nhất để tiết kiệm một vài thao tác chính.


5
thay thế (.*)bằng <row id="\1" />trong chế độ regex mà không có . matches newlinesẽ giúp bạn hoàn thành 100% chặng đường.
satibel

4

http://docs.notepad-plus-plus.org/index.php/Inserting_Variable_Text

Notepad ++ được trang bị Trình chỉnh sửa -> Cột "Alt + C" có thể hoạt động trên vùng chọn hình chữ nhật theo hai cách khác nhau: Coledit.png chèn một số văn bản cố định trên mọi dòng bao gồm và theo sau dòng hiện tại, tại cột chèn điểm (hay còn gọi là dấu mũ). Văn bản được chọn ban đầu được giữ nguyên. Như hình minh họa, một chuỗi số tuyến tính có thể được chèn theo cách tương tự. Giá trị bắt đầu và gia số sẽ được cung cấp. Phần đệm bên trái với các số 0 là một tùy chọn và số có thể được nhập vào cơ số 2, 8, 10 hoặc 16 - đây là cách các giá trị được tính toán cũng sẽ được hiển thị, phần đệm dựa trên giá trị lớn nhất.


Nó sẽ tốt hơn nhiều nếu bạn đính kèm hình ảnh trong bài để tránh nhầm lẫn đọc câu trả lời của bạn
Aminah Nuraini


1

(Đăng trong trường hợp ai đó có thể sử dụng nó).

Tôi đang tìm giải pháp cho một vấn đề phức tạp hơn một chút so với OP - thay thế MỌI sự xuất hiện của điều gì đó bằng số thứ tự bằng số tăng dần

Ví dụ: Thay thế một cái gì đó như thế này:

<row id="1" />
<row id="2" />
<row id="1" />
<row id="3" />
<row id="1" />

Bằng cách này:

<row id="2" />
<row id="3" />
<row id="2" />
<row id="4" />
<row id="2" />

Không thể tìm thấy giải pháp trực tuyến vì vậy tôi đã viết kịch bản của riêng mình trong groovy (hơi xấu nhưng thực hiện được công việc):

 /**
 * <p> Finds words that matches template and increases them by 1.
 * '_' in word template represents number.
 *
 * <p> E.g. if template equals 'Row="_"', then:
 * ALL Row=0 will be replaced by Row="1"
 * All Row=1 will be replaced by Row="2"
 * <p> Warning - your find template might not work properly if _ is the last character of it
 * etc.
 * <p> Requirments:
 * - Original text does not contain tepmlate string
 * - Only numbers in non-disrupted sequence are incremented and replaced
 * (i.e. from example below, if Row=4 exists in original text, but Row=3 not, than Row=4 will NOT be 
 * replaced by Row=5)
 */
def replace_inc(String text, int startingIndex, String findTemplate) {
    assert findTemplate.contains('_') : 'search template needs to contain "_" placeholder'
    assert !(findTemplate.replaceFirst('_','').contains('_')) : 'only one "_" placeholder is allowed'
    assert !text.contains('_____') : 'input text should not contain "______" (5 underscores)'
    while (true) {
        findString = findTemplate.replace("_",(startingIndex).toString())
        if (!text.contains(findString)) break;
        replaceString = findTemplate.replace("_", "_____"+(++startingIndex).toString())
        text = text.replaceAll(findString, replaceString)
    }
    return text.replaceAll("_____","") // get rid of '_____' character
}

// input
findTemplate = 'Row="_"'
path = /C:\TEMP\working_copy.txt/
startingIndex = 0

// do stuff
f = new File(path)
outText = replace_inc(f.text,startingIndex,findTemplate)
println "Results \n: " + outText
f.withWriter { out -> out.println outText }
println "Results written to $f"

1

Bạn có thể làm điều đó bằng cách sử dụng Powershell thông qua vòng lặp regex và foreach, nếu bạn lưu trữ các giá trị của mình trong tệp input.txt :

$initialNum=1; $increment=1; $tmp = Get-Content input.txt | foreach {  $n = [regex]::match($_,'id="(\d+)"').groups[1
].value; if ($n) {$_ -replace "$n", ([int32]$initialNum+$increment); $increment=$increment+1;} else {$_}; }

Sau đó, bạn có thể lưu trữ $ tmp trong tệp bằng cách sử dụng $tmp > result.txt. Điều này không cần dữ liệu ở trong cột.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.