Notepad ++ schrittweise ersetzen


83

Nehmen wir an, ich möchte 10 Datenzeilen haben, aber ich möchte, dass ein Wert für jede Zeile oder jedes Datenelement erhöht wird. Wie erhöhe ich diesen Wert?

Zum Beispiel ... Wenn ich diese Zeilen habe, gibt es eine Regex-Möglichkeit, die ID-Werte zu ersetzen, um sie zu erhöhen?

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

--- Hier ist, wie es aussehen soll ... (wenn die ID der ersten Zeile nach oben geht, ist das in Ordnung)

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

Notepad ++ - Ersetzungen machen weder Mathe noch Regex.
Amber

Wenn es möglich ist, ist es unglaublich schwer. Es gibt kein Konzept für Zahlen in regulären Ausdrücken (es gibt also keine +1) und es gibt keine einfache Möglichkeit, Daten zu akkumulieren, wenn Sie mit einem regulären Ausdruck übereinstimmen (es gibt also keine "nächste" Übereinstimmung). XSLT kann Ihnen hier helfen, wenn Sie dies wirklich automatisieren müssen.

@ Amber Notepad ++ verfügt über eine eingeschränkte Regex-Funktionalität.
Karolis

@ Karolis Das ist mir sehr bewusst. Ich habe nur gesagt, dass weder Regex (von Natur aus) noch Notepad ++ 's Implementierung von Suchen und Ersetzen mit diesem Regex Mathematik für Ersetzungen unterstützen.
Amber

1
Obwohl Regex als mögliche Methode erwähnt (und markiert) wurde, schien sich das OP weniger mit der jeweiligen Methode zu befassen, als nur zu wissen, ob Notepad ++ die Aufgabe erledigen kann ... welche Antwort von voithos perfekt adressiert.
Jbobbins

Antworten:


155

Ich bin mir bei Regex nicht sicher, aber es gibt eine Möglichkeit, dies in Notepad ++ zu tun, obwohl es nicht sehr flexibel ist.

Halten AltSie in dem von Ihnen angegebenen Beispiel die Spalte mit den Zahlen, die Sie ändern möchten , gedrückt und wählen Sie sie aus. Gehen Sie dann zu Edit->Column Editorund wählen Sie das Number to InsertOptionsfeld im angezeigten Fenster. Geben Sie dann Ihre Anfangsnummer und Ihr Inkrement an und klicken Sie auf OK. Es sollte die inkrementierten Zahlen ausschreiben.

Hinweis: Dies funktioniert auch mit der Multi-editingFunktion (Auswahl mehrerer Positionen bei Ctrlgedrückter Taste).

Dies ist jedoch nicht annähernd die Flexibilität, die die meisten Menschen für nützlich halten würden. Notepad ++ ist großartig, aber wenn Sie einen wirklich leistungsstarken Editor suchen, der solche Dinge problemlos ausführen kann, würde ich sagen, verwenden Sie Vim.


4
+1 sowohl für die obskure Spaltenfunktion als auch für die Feststellung, dass vim ein leistungsfähigerer Editor ist. ;)
Spencer Rathbun

Notepad ++ ist großartig. Es wäre großartig, wenn wir einen Online-Texteditor hätten, der so leistungsfähig ist wie dieser.
Luiz Feijão Veronesi

1
Für mich war: Wählen Sie die Spalte mit Alt + Umschalt aus und geben Sie dann die einzufügende Zahl ein. Funktioniert perfekt
Rombus

Vielen Dank! Diese Funktion ist großartig. Außerdem konnte ich die Spalte durch Doppelklick auswählen.
Rahim Khoja

Einfach super! Ich habe gerade mein Leben gerettet, als ich 300 Insert-Anweisungen vorbereiten musste
DoNuT

14

Ich habe heute nach der gleichen Funktion gesucht, konnte dies aber in Notepad ++ nicht tun. Wir haben jedoch TextPad zu unserer Rettung. Es hat bei mir funktioniert.

Aktivieren Sie im TextPad-Ersetzungsdialog den regulären Ausdruck. dann könnten Sie versuchen, zu ersetzen

<row id="1"/>

durch

<row id="\i"/>

Schauen Sie sich diesen Link an, um weitere erstaunliche Funktionen zum Ersetzen von TextPad zu finden - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/


1
Ich denke, es hilft, wenn ich tatsächlich aufpasse. Installation von SublimeText beendet. :) Vielen Dank.
RTF

1
Stellen Sie jedoch sicher, dass Sie auf die Schaltfläche "Alle ersetzen" klicken. "Als nächstes ersetzen" erhöht den Zähler nicht. Es dauerte Stunden, um das herauszufinden. \ i Durch Zahlen ab 1 ersetzen, um 1 erhöhen. \ i (10) Durch Zahlen ab 10 ersetzen, um 1 erhöhen. \ i (0,10) Durch Zahlen ab 0 ersetzen, um 10 erhöhen. \ i ( 100, -10) Durch Zahlen ab 100 ersetzen und um -10 dekrementieren.
Venkatesh Muniyandi

8

Ich hatte das gleiche Problem mit mehr als 250 Zeilen und hier ist, wie ich es gemacht habe:

zum Beispiel :

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

Sie setzen den Cursor direkt nach der "1" und klicken auf alt + shiftund beginnen mit dem Abwärtspfeil abzusteigen, bis Sie die unterste Zeile erreichen. Jetzt sehen Sie eine Gruppe von Auswahlen. Klicken Sie auf Löschen, um die Nummer 1 in jeder Zeile gleichzeitig zu löschen, und gehen Sie zu Edit -> Column Editorund wählen Sie Number to InsertGeben Sie dann das 1Feld für die Anfangsnummer ein und 1erhöhen Sie es um das Feld. Überprüfen Sie die Nullzahlen und klicken Sie aufok

Herzlichen Glückwunsch, du hast es geschafft :)


5

Da es nur begrenzte reale Antworten gibt, werde ich diese Problemumgehung teilen. Für wirklich einfache Fälle wie Ihr Beispiel machen Sie es rückwärts ...

Davon

1
2
3
4
5

Ersetzen Sie \r\ndurch " />\r\n<row id="und Sie erhalten 90% des Weges dorthin

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

Oder ist eine ähnliche Art und Weise, wie Sie Daten mit Excel / Tabellenkalkulation hacken können. Teilen Sie einfach Ihre Originaldaten in Spalten auf und bearbeiten Sie die Werte nach Bedarf.

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

Offensichtliche Dinge, aber es kann jemandem helfen, den einen oder anderen einmaligen Hack-Job zu erledigen, um ein paar Tastenanschläge zu sparen.


5
Ersetzen (.*)mit <row id="\1" />in regex Modus ohne . matches newlineerhalten Sie 100% der Art und Weise dorthin gelangen.
Satibel

4

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

Notepad ++ ist mit einem Editor "Bearbeiten -> Spalte" Alt + C "ausgestattet, mit dem eine rechteckige Auswahl auf zwei verschiedene Arten bearbeitet werden kann: Coledit.png fügt in jeder Zeile, einschließlich und nach der aktuellen Zeile, in der Spalte der Einfügung festen Text ein Punkt (auch bekannt als Caret). Der ursprünglich ausgewählte Text bleibt unberührt. Wie das Bild zeigt, kann auf die gleiche Weise eine lineare Reihe von Zahlen eingefügt werden. Startwert und Inkrement sind anzugeben. Das Auffüllen der linken Seite mit Nullen ist eine Option, und die Zahl kann in Basis 2, 8, 10 oder 16 eingegeben werden. Auf diese Weise werden auch die berechneten Werte angezeigt, wobei das Auffüllen auf dem größten basiert.


Es ist viel besser, wenn Sie das Bild in den Beitrag anhängen, um Verwirrung beim Lesen Ihrer Antwort zu vermeiden
Aminah Nuraini


1

(Posting für den Fall, dass jemand davon Gebrauch macht).

Ich suchte nach einer Lösung für ein Problem, das etwas ausgefeilter als OP ist - indem ich JEDES Auftreten von etwas mit der Nummer durch dasselbe durch eine inkrementierte Nummer ersetzte

ZB so etwas ersetzen:

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

Dadurch:

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

Konnte die Lösung nicht online finden, also habe ich mein eigenes Skript in groovig geschrieben (ein bisschen hässlich, macht aber den Job):

 /**
 * <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

Sie können dies mit Powershell über Regex und Foreach-Schleife tun, wenn Sie Ihre Werte in der Datei input.txt speichern :

$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 {$_}; }

Danach können Sie $ tmp mit in der Datei speichern $tmp > result.txt. Dies erfordert keine Daten in Spalten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.