web-dev-qa-db-fra.com

Notepad ++ remplace progressivement

Disons que je veux avoir 10 lignes de données mais que je veux une valeur à incrémenter pour chaque ligne ou morceau de données. Comment puis-je augmenter cette valeur?

Par exemple ... Si j'ai ces lignes, existe-t-il un moyen rationnel de remplacer les valeurs id pour incrémenter?

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

--- Voici à quoi je voudrais que cela ressemble ... (si l'identifiant de la première rangée monte, c'est ok)

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

Pas sûr de regex, mais vous pouvez le faire dans Notepad ++, bien que ce ne soit pas très flexible.

Dans l'exemple que vous avez donné, maintenez Alt et sélectionnez la colonne de nombres que vous souhaitez modifier. Ensuite aller à Edit->Column Editor et sélectionnez le Number to Insert Bouton radio dans la fenêtre qui apparaît. Spécifiez ensuite votre numéro initial et votre incrément, puis cliquez sur OK. Il devrait écrire les nombres incrémentés.

Note: cela fonctionne aussi avec le Multi-editing fonction (sélection de plusieurs emplacements tout en maintenant Ctrl touche enfoncée).

Ce n’est cependant pas du tout la flexibilité que la plupart des gens trouveraient utile. Notepad ++ est génial, mais si vous voulez un éditeur vraiment puissant capable de faire ce genre de choses facilement, utilisez plutôt Vim.

149
voithos

Je cherchais la même fonctionnalité aujourd'hui, mais je ne pouvais pas le faire dans Notepad ++. Cependant, nous avons TextPad à notre secours. Cela a fonctionné pour moi.

Dans la boîte de dialogue Remplacer de TextPad, activez regex; alors vous pourriez essayer de remplacer

<row id="1"/>

par

<row id="\i"/>

Jetez un coup d'œil à ce lien pour découvrir d'autres fonctionnalités étonnantes de remplacement de TextPad - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/

14
Bipin Mangwani

Comme les réponses réelles sont limitées, je vais partager cette solution de contournement. Pour vraiment des cas simples comme votre exemple, vous le faites à l'envers ...

À partir de cela

1
2
3
4
5

Remplacer \r\n avec " />\r\n<row id=" et vous aurez 90% du chemin

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

Ou est-ce une façon similaire de pirater des données avec Excel/tableur. Divisez simplement vos données d'origine en colonnes et manipulez les valeurs selon vos besoins.

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

Des choses évidentes, mais cela peut aider quelqu'un qui fait le travail de bidouillage ponctuel à sauvegarder quelques touches.

5
KCD

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

Notepad ++ est équipé d'un éditeur "Alt + C" Edit -> Column qui permet de travailler sur une sélection rectangulaire de deux manières différentes: point (aka caret). Le texte initialement sélectionné reste inchangé. Comme l'illustre l'image, une série linéaire de nombres peut être insérée de la même manière. La valeur de départ et l'incrément doivent être fournis. Le remplissage à gauche avec des zéros est une option, et le nombre peut être entré en base 2, 8, 10 ou 16 - c'est ainsi que les valeurs calculées seront également affichées, le remplissage étant basé sur la plus grande.

4
Ailson Costa

j'ai eu le même problème avec plus de 250 lignes et voici comment je l'ai fait:

par exemple :

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

vous mettez le curseur juste après le "1" et vous cliquez sur alt + shift et commencez à descendre avec la flèche vers le bas jusqu'à atteindre la ligne du bas. Maintenant vous voyez un groupe de sélections. Cliquez sur effacer pour effacer le numéro 1 simultanément sur chaque ligne et aller à Edit -> Column Editor et sélectionnez Number to Insert puis mettez 1 dans le champ du numéro initial et 1 incrémenté par champ, vérifiez les chiffres nuls et cliquez ok

Félicitations, vous l'avez fait :)

3
Mourad El Aomari


Les solutions suggérées ci-dessus ne fonctionneront que si les données sont alignées.
Voir la solution dans le lien en utilisant le plug-in PythonScript Notepad ++, ça marche très bien!

stackoverflow rechercher/remplacer mais incrémenter la valeur

3
user648026

(Poster au cas où quelqu'un pourrait en avoir l'usage).

Je cherchais une solution à un problème un peu plus sophistiqué que l'OP - remplacer CHAQUE occurrence de quelque chose par le nombre par la même chose avec un nombre incrémenté

Par exemple. Remplacer quelque chose comme ceci:

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

Par ça:

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

Impossible de trouver la solution en ligne, j'ai donc écrit mon propre script dans groovy (un peu moche mais fait le travail):

 /**
 * <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"
2
Kranach

Vous pouvez le faire en utilisant Powershell via regex et foreach loop, si vous stockez vos valeurs dans le fichier 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 {$_}; }

Après cela, vous pouvez stocker $ tmp dans un fichier en utilisant $tmp > result.txt. Cela n’a pas besoin que les données soient en colonnes.

1
Ivan G