2011-09-29 40 views
68

Digamos que quiero tener 10 filas de datos, pero quiero que se incremente el valor de cada fila o dato. ¿Cómo incremento ese valor?Notepad ++ reemplazar incrementalmente

Por ejemplo .... Si tengo estas filas, hay una manera de expresiones regulares de la sustitución de los valores de ID para incrementar?

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

--- Esto es lo que me gustaría que se vea como ... (si el id de la primera fila sube uno eso es bueno)

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

Los reemplazos de Notepad ++ no hacen matemática, ni tampoco regex. – Amber

+0

Si es posible, es increíblemente difícil. No existe un concepto de números en las expresiones regulares (por lo que no hay +1) y no hay una manera fácil de acumular datos cuando se combina una expresión regular (por lo que no hay una coincidencia "siguiente"). XSLT podría ayudarlo aquí, si realmente necesita tener que automatizar esto. –

+0

@Amber Notepad ++ tiene una funcionalidad de expresiones regulares limitada. – Karolis

Respuesta

135

No está seguro acerca de expresiones regulares, pero hay una forma de hacerlo en Notepad ++, aunque no es muy flexible.

En el ejemplo que diste, mantenga Alt y seleccione la columna de números que desea cambiar. Luego, vaya al Edit->Column Editor y seleccione el botón Number to Insert en la ventana que aparece. Luego, especifique su número inicial y su incremento, y presione OK. Debe escribir los números incrementados.

Nota: esto también funciona con la característica Multi-editing (seleccionar varios lugares, manteniendo Ctrl tecla pulsada).

Esto es, sin embargo, no en cualquier lugar cerca de la flexibilidad que la mayoría de la gente encontraría útil. Notepad ++ es genial, pero si quieres un editor realmente poderoso que pueda hacer cosas como esta con facilidad, yo diría que uses Vim.

+4

+1 tanto para la característica de columna oscura como para señalar que vim es un editor más potente. ;) –

+0

Notepad ++ es increíble, sería genial si tenemos un editor de texto en línea tan poderoso como este. –

+1

Para mí fue: seleccione la columna con Alt + Shift y luego haga el número para insertar. Funciona perfectamente – Rombus

5

Dado que hay respuestas reales limitadas, compartiré esta solución. Para realmente casos simples como tu ejemplo lo haces al revés ...

De esta

1 
2 
3 
4 
5 

Reemplazar \r\n con " />\r\n<row id=" y obtendrá un 90% de la manera allí

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

O es una forma similar de piratear datos con Excel/hoja de cálculo. Simplemente divida sus datos originales en columnas y manipule valores según lo requiera.

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

cosas obvias pero puede ayudar a alguien a hacer el trabajo de una sola vez extraño truco para ahorrar unos cuantos pulsaciones de teclas.

+3

reemplazando '(. *)' Con '' en modo regex sin '. los partidos con newline' te darán el 100% del camino hasta allí. – satibel

12

Estaba buscando la misma característica hoy pero no pude hacer esto en Notepad ++. Sin embargo, tenemos TextPad para nuestro rescate. Funcionó para mí

En el cuadro de diálogo reemplazar de TextPad, active la expresión regular; entonces se podría intentar sustituir

<row id="1"/> 

por

<row id="\i"/> 

Echa un vistazo a este enlace para más increíble reemplazar características de TextPad - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/

+1

Supongo que ayuda si realmente presto atención. Terminó la instalación de SublimeText. :) Gracias. –

+0

Funcionó perfecto para mí, ¡gracias! –

+0

Pero asegúrese de presionar el botón "Reemplazar todo". "Reemplazar siguiente" no incrementará el contador. Tardó horas en resolver esto. \ i Reemplace con números comenzando desde 1, incrementando por 1. \ i (10) Reemplace con números comenzando desde 10, incrementando por 1. \ i (0,10) Reemplace con números comenzando desde 0, incrementando por 10 \ i (100, -10) Reemplazar con números comenzando desde 100, decrementando por -10. –

2

(Publicación en caso de que alguien podría tener un uso de ella).

que estaba buscando una solución para un problema un poco más sofisticado que OP - reemplazar cada ocurrencia de algo con el número por el mismo con número incrementado

P. ej Sustitución de algo como esto:

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

Por esto:

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

pude encontrar la solución en línea por lo que escribió mi propio guión en el maravilloso (un poco feo, pero hace el trabajo):

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

tuve el mismo problema con más de 250 líneas y así es como lo hice:

por ejemplo:

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

se pone el cursor justo después de que el "1" y se hace clic en alt + shift y comienza a descender con la flecha hacia abajo que le llevará hasta la línea de fondo ahora se ve un grupo de selecciones clic en Borrar para borrar el número 1 en la cada línea de forma simultánea e ir a Edit -> Column Editor y seleccione Number to Insert a continuación, poner en 1 campo de número inicial y en 1 incrementa en campo y comprobar los números cero y haga clic ok

Felicidades lo hizo :)

3

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

Notepad ++ viene equipado con una Edición -> Columna "Alt + C" Editor que puede trabajar en una selección rectangular de dos maneras diferentes: Coledit.png insertar un texto fijo en cada línea incluida y siguiendo la línea actual, en la columna del punto de inserción (aka caret). El texto seleccionado inicialmente no se toca. Como ilustra la imagen, se puede insertar una serie lineal de números de la misma manera. El valor inicial y el incremento deben ser proporcionados. El relleno izquierdo con ceros es una opción, y el número puede ingresarse en la base 2, 8, 10 o 16; así es como se mostrarán los valores calculados, y el relleno se basará en el más grande.

+0

Será mucho mejor si adjuntas la imagen en la publicación para evitar confusiones al leer tu respuesta –

1

usted puede hacerlo a través de expresiones regulares usando Powershell y foreach bucle, si se almacenan los valores en el archivo entrada.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 {$_}; } 

Después de que se puede almacenar en $ tmp archivo usando $tmp > result.txt. Esto no necesita datos para estar en columnas.