Notepad ++ stopniowo zamienia

85

Powiedzmy, że chcę mieć 10 wierszy danych, ale chcę, aby wartość była zwiększana dla każdego wiersza lub fragmentu danych. Jak zwiększyć tę wartość?

Na przykład .... Jeśli mam te wiersze, czy istnieje regex sposób na zastąpienie wartości id w celu zwiększenia?

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

--- Oto jak chciałbym, aby wyglądało ... (jeśli id ​​w pierwszym rzędzie idzie w górę, to jest w porządku)

<row id="1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5" />
Travyguy9
źródło
Zamienniki Notepad ++ nie wykonują matematyki ani wyrażeń regularnych.
Amber,
Jeśli to możliwe, jest to niezwykle trudne. Nie ma pojęcia liczb w wyrażeniach regularnych (więc nie ma +1) i nie ma łatwego sposobu gromadzenia danych podczas dopasowywania wyrażenia regularnego (więc nie ma „następnego” dopasowania). XSLT może Ci w tym pomóc, jeśli naprawdę musisz to zautomatyzować.
@Amber Notepad ++ ma ograniczoną funkcjonalność wyrażeń regularnych.
Karolis,
@Karolis Jestem tego bardzo świadomy. Po prostu mówiłem, że ani regex (wrodzona), ani implementacja wyszukiwania i zamiany w Notepad ++ przy użyciu tego wyrażenia regularnego nie obsługują matematyki dla zastąpień.
Bursztyn
1
Chociaż regex został wymieniony (i oznaczony) jako możliwa metoda, OP wydawał się mniej zainteresowany tą konkretną metodą niż po prostu wiedząc, czy Notepad ++ może wykonać zadanie ... która odpowiedź voithos idealnie odpowiada.
jbobbins,

Odpowiedzi:

159

Nie jestem pewien co do wyrażenia regularnego, ale jest sposób, aby to zrobić w Notepad ++, chociaż nie jest on zbyt elastyczny.

W podanym przykładzie przytrzymaj Alti wybierz kolumnę liczb, którą chcesz zmienić. Następnie idź doEdit->Column Editor i wybierz Number to Insertprzycisk opcji w wyświetlonym oknie. Następnie podaj początkową liczbę i przyrost i naciśnij OK. Powinien wypisać zwiększone liczby.

Uwaga: działa to również z Multi-editing funkcją (wybieranie kilku lokalizacji przy Ctrlwciśniętym klawiszu).

Nie jest to jednak żadna elastyczność, którą większość ludzi uznałaby za przydatną. Notepad ++ jest świetny, ale jeśli chcesz naprawdę potężnego edytora, który może z łatwością robić takie rzeczy, powiedziałbym, że użyj Vima.

voithos
źródło
4
+1 zarówno dla niejasnej funkcji kolumn, jak i zauważając, że vim jest potężniejszym edytorem. ;)
Spencer Rathbun
Notepad ++ jest niesamowity, byłoby wspaniale, gdybyśmy mieli tak potężny edytor tekstu online jak ten.
Luiz Feijão Veronesi
1
Dla mnie było: wybierz kolumnę za pomocą Alt + Shift, a następnie zrób numer do wstawienia. Działa idealnie
Rombus
Dzięki! Ta funkcja jest świetna. mogłem również wybrać kolumnę, klikając ją dwukrotnie.
Rahim Khoja
Po prostu niesamowite! Właśnie uratowałem mi życie, kiedy
musiałem
14

Szukałem dzisiaj tej samej funkcji, ale nie mogłem tego zrobić w Notepad ++. Mamy jednak na ratunek TextPada. U mnie to zadziałało.

W oknie dialogowym zamiany TextPada włącz wyrażenie regularne; wtedy możesz spróbować wymienić

<row id="1"/>

przez

<row id="\i"/>

Spójrz na ten link, aby uzyskać dalsze niesamowite funkcje zastępowania TextPada - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/

Bipin Mangwani
źródło
1
Myślę, że to pomaga, jeśli naprawdę zwracam uwagę. Skończyło się na instalacji SublimeText. :) Dzięki.
rtf
1
Ale upewnij się, że kliknąłeś przycisk „Zamień wszystko”. „Zamień następny” nie zwiększy licznika. Zrozumienie tego zajęło godziny. \ i Zastąp liczbami zaczynającymi się od 1, rosnącymi o 1. \ i (10) Zastąp liczbami zaczynającymi się od 10, rosnącymi o 1. \ i (0,10) Zastąp liczbami zaczynającymi się od 0, zwiększanymi o 10. \ i ( 100, -10) Zastąp liczbami zaczynającymi się od 100, zmniejszając o -10.
Venkatesh Muniyandi
8

Miałem ten sam problem z ponad 250 liniami i oto jak to zrobiłem:

na przykład :

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

umieszczasz kursor tuż za "1" i klikasz alt + shifti zaczynasz opadać strzałką w dół, aż dojdziesz do dolnej linii teraz zobaczysz grupę wyborów kliknij wymaż aby usunąć cyfrę 1 w każdej linii jednocześnie i przejdź do Edit -> Column Editori wybierz Number to Insertnastępnie 1wprowadź początkowe pole liczbowe i 1zwiększaj o pole, sprawdź cyfry zerowe i kliknijok

Gratulacje, że to zrobiłeś :)

Mourad El Aomari
źródło
5

Ponieważ liczba rzeczywistych odpowiedzi jest ograniczona, udostępnię to obejście. dla naprawdę prostych przypadkach, takich jak twój przykład, robisz to wstecz ...

Od tego

1
2
3
4
5

Wymień \r\nsię " />\r\n<row id=", a otrzymasz 90% drogi tam

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

Lub w podobny sposób możesz zhakować dane za pomocą programu Excel / arkusza kalkulacyjnego. Po prostu podziel oryginalne dane na kolumny i manipuluj wartościami zgodnie z potrzebami.

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

Oczywiste rzeczy, ale może pomóc komuś wykonującemu dziwną jednorazową pracę hakerską, aby zaoszczędzić kilka naciśnięć klawiszy.

KCD
źródło
5
zastąpienie (.*)przez <row id="\1" />w trybie regex bez . matches newlinezapewni Ci 100% możliwości.
satibel
4

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

Notepad ++ jest wyposażony w edytor Edycja -> Kolumna "Alt + C", który może pracować na prostokątnym zaznaczeniu na dwa różne sposoby: Coledit.png wstawianie stałego tekstu w każdej linii, w tym i po bieżącej linii, w kolumnie wstawiania punkt (aka daszek). Początkowo zaznaczony tekst pozostaje nietknięty. Jak pokazano na rysunku, liniowy ciąg liczb można wstawić w ten sam sposób. Należy podać wartość początkową i przyrost. Opcją jest wypełnienie z lewej strony zerami, a liczbę można wpisać w bazie 2, 8, 10 lub 16 - tak też będą wyświetlane obliczone wartości, dopełnienie oparte na największej.

Ailson Costa
źródło
Będzie znacznie lepiej, jeśli
załączysz
1

(Publikowanie na wypadek, gdyby ktoś mógł z niego skorzystać).

Szukałem rozwiązania problemu nieco bardziej wyrafinowanego niż OP - zamiana KAŻDEGO wystąpienia czegoś z numerem na to samo ze zwiększoną liczbą

Np. Zastąpienie czegoś takiego:

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

Przez to:

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

Nie mogłem znaleźć rozwiązania online, więc napisałem własny skrypt w groovy (trochę brzydki, ale spełnia swoje zadanie):

 /**
 * <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"
Kranach
źródło
1

Możesz to zrobić za pomocą Powershell poprzez regex i pętlę foreach, jeśli przechowujesz swoje wartości w pliku 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 {$_}; }

Następnie możesz zapisać $ tmp w pliku za pomocą $tmp > result.txt. Nie musi to być dane w kolumnach.

Ivan G.
źródło