regex - how - regular expression |]
Notepad++ reemplazar incrementalmente (8)
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?
Por ejemplo ... Si tengo estas filas, ¿hay alguna forma regular de reemplazar los valores de identificación para incrementar?
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
<row id="1" />
--- Aquí es lo que me gustaría que se vea ... (si el ID de la primera fila sube uno, está bien)
<row id="1" />
<row id="2" />
<row id="3" />
<row id="4" />
<row id="5" />
(Publicación en caso de que alguien pueda usarla).
Estaba buscando una solución para un problema un poco más sofisticado que OP - reemplazando CADA ocurrencia de algo con el número por lo mismo con un número incrementado
Ej. Reemplazar 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" />
No pude encontrar la solución en línea, así que escribí mi propio guión en groovy (un poco feo pero cumple su función):
/**
* <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"
Dado que hay respuestas reales limitadas, compartiré esta solución. Para casos realmente simples como tu ejemplo, hazlo al revés ...
De esto
1
2
3
4
5
Reemplace /r/n
con " />/r/n<row id="
y obtendrá el 90% del camino 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 | " /> |
Obvio, pero puede ayudar a alguien que hace un extraño trabajo de hackear para guardar algunas teclas.
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 Regex; entonces podrías intentar reemplazar
<row id="1"/>
por
<row id="/i"/>
Eche un vistazo a este enlace para obtener funciones adicionales increíbles de TextPad - http://sublimetext.userecho.com/topic/106519-generate-a-sequence-of-numbers-increment-replace/
No estoy seguro acerca de la expresión regular, pero hay una forma de hacerlo en Notepad ++, aunque no es muy flexible.
En el ejemplo que dio, mantenga presionada la Alt
y seleccione la columna de números que desea cambiar. Luego vaya a Edit->Column Editor
y seleccione el botón de selecció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 Multi-editing
(seleccionando varias ubicaciones mientras se mantiene presionada la tecla Ctrl ).
Sin embargo, esto no está cerca de la flexibilidad que la mayoría de las personas 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.
Puede hacerlo usando Powershell a través de regex y foreach loop, si almacena sus valores en el archivo 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 {$_}; }
Después de eso, puede almacenar $ tmp en el archivo usando $tmp > result.txt
. Esto no necesita datos para estar en columnas.
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" />
colocas el cursor justo después del "1" y haces clic en alt + shift
y comienzas a descender con la flecha hacia abajo hasta que alcances la línea inferior ahora ves un grupo de selecciones haz clic en borrar para borrar el número 1 en cada línea al mismo tiempo e ir Edit -> Column Editor
y seleccionar Number to Insert
luego poner 1
en el campo de número inicial y 1
en incrementado por campo y verificar los números cero y hacer clic en ok
Felicitaciones, lo has hecho :)
http://docs.notepad-plus-plus.org/index.php/Inserting_Variable_Text
Notepad ++ viene equipado con un Editor de Edición -> Columna "Alt + C" que puede trabajar en una selección rectangular de dos maneras diferentes: Coledit.png insertando un texto fijo en cada línea que incluye y sigue la línea actual, en la columna de la inserción punto (aka caret). El texto seleccionado inicialmente no se toca. Como ilustra la imagen, una serie lineal de números se puede insertar 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.
Las soluciones sugeridas anteriormente solo funcionarán si los datos están alineados.
Ver la solución en el enlace utilizando el complemento PythonScript Notepad ++. ¡Funciona muy bien!