¿Eliminar todas las líneas en Notepad ++ excepto las líneas que contienen una palabra que necesito?

201

Tengo un archivo de texto y quiero mantener las líneas comenzadas <Path>y eliminar todas las demás líneas.

¿Cómo puedo hacerlo?

wonea
fuente
Relacionado: stackoverflow.com/questions/8264391/…
Cees Timmerman
1
El complemento LineFilter2 también es fácil de usar.
Karsten

Respuestas:

292

Hay una manera fácil de lograr esto. Necesitas realizar 3 pasos.

  1. Vaya al menú Buscar> Buscar ...> Seleccione la pestaña "Marcar". Activar expresiones regulares. Busque ^<Path>( ^es para inicio de línea). No olvide marcar "Líneas de marcador" y presione "Marcar todo"

    ==> Todas las filas que desea mantener tienen un marcador

  2. Vaya al menú "Buscar - Marcador - Marcador inverso"

    ==> Todas las líneas que desea eliminar están marcadas.

  3. Vaya al menú "Buscar - Marcador - Eliminar líneas marcadas"

    ==> Todas las líneas marcadas se eliminan.

Stema
fuente
47
+1. Bien, no sabía sobre esto. También hay opciones para "Eliminar líneas sin marcar" o "Cortar / copiar líneas marcadas" que pueden ahorrar algo de tiempo.
deizel
66
Al principio tuve problemas porque mi versión (6.2.3) de Notepad ++ no tiene un elemento de menú llamado "Marcar pestaña". En su lugar, debe ir a "Buscar" -> "Buscar ..." -> haga clic en la pestaña "Marcar". Y ya no tienes que invertir los marcadores. Notepad ++ ahora tiene "Eliminar líneas sin marcar". ¡Pero tu consejo me ayudó mucho! ¡Gracias!
aakoch
22
Puede omitir el paso 2, porque es posible (al menos desde v6.4.5) elegir "Eliminar líneas sin marcar".
Juliano
44
Estoy usando Notepad ++ durante tanto tiempo y nunca antes había sabido qué son los 'Marcadores'. Es sorprendente lo poderosa que es esa herramienta y lo poco que sé sobre ella.
Danubian Sailor
Eres un genio Este es solo otro ejemplo sorprendente de cómo conocer la herramienta que utiliza de verdad.
Marcello Grechi Lins
67

En realidad, esto se puede hacer en dos pasos a partir de 6.3. Creo que se puede hacer antes de eso, ya que tenía 5.9 cuando lo probé por primera vez.

Usando la publicación de Stema como base de esta respuesta. Hay un paso menos ahora. Marcar líneas y eliminar líneas sin marcar. Hecho. Instrucciones detalladas a continuación.

  1. Menú de búsqueda "Buscar". En el cuadro de diálogo Buscar, haga clic en la pestaña "Marcar". Activar expresiones regulares. Busque ^<Path>( ^es para inicio de línea). No olvide marcar "Líneas de marcador" y presione "Marcar todo"

    ==> Todas las filas que desea mantener ahora tienen un marcador

  2. Menú de búsqueda -> Marcador -> Eliminar líneas sin marcar.

    ==> Todas las líneas NO marcadas se eliminan.

Reconocedor
fuente
3
Esto me llevó 10 segundos, mientras que la otra solución me llevó más de 20 segundos. ¡Gracias!
Negro
No necesitaba agregar el ^en mi término de búsqueda, ni usar expresiones regulares. Espero que esto ayude a alguien.
sa_leinad
29

Solución limpia de regex solamente

Variante de dos pasos

  1. regex reemplazar

    (?!^.*test.*$)^.+
    

    reemplazar prueba con el texto solicitado

  2. reemplazar

    [\r\n]{2,}
    

    con \r\n

Variante de un solo paso

Se usa ^(?!<Path>).*\r\npara reemplazar las coincidencias con una cadena vacía. La versión generalizada sería ^(?!.*?test).*\r\n. Esto no eliminará la línea vacía al final del archivo. Todas las demás líneas se eliminan, incluidas varias líneas vacías consecutivas.

Explicación:

  1. (?!)Es una mirada negativa hacia arriba. ^.*test.*$ selecciona toda la línea que contiene el texto solicitado.

  2. [\r\n]{2,}coincide con cualquiera \r\nque ocurra más de una vez que esta sea la nueva línea de Windows. Si tiene Linux u otro sistema operativo, es posible que deba meterse con esto. el segundo es reemplazarlo con una línea de retorno.

sonar0m
fuente
1
Nota para los pueblos: A veces, la expresión regular con final de línea (EOL) "no funciona". La \r\nEOL mencionada en la publicación es la que usa Windows y, por lo tanto, puede o no ser lo que está buscando. A menudo en entornos Linux es justo \n, o en entornos Mac solo \r, por lo que si extraes un archivo de cualquiera de ellos, no será EOL de estilo Windows. Sin embargo, si descarga a través de FileZilla y los activadores de modo ASCII, puede volver a cambiarlos a Windows EOL (como \nen \r\n). Entonces, si regex no funciona, verifique el estilo de EOL yendo a "Ver> Mostrar símbolos> Mostrar fin de línea". CR = \r. LF = \n.
dhaupin
5

Me parece que la forma más fácil es usar la función "Buscar todo en el documento actual" y luego copiar los resultados en un nuevo archivo o seleccionar todo y reemplazarlo en el actual.

Esto buscaría todas las líneas que contienen su texto y las enumeraría en la parte inferior. Simplemente haga clic derecho en el resultado de búsqueda y copie / pegue.

Gubbins
fuente
Debe eliminar los números de línea reemplazándolos \tLine [\d]*: . Sigue siendo una gran respuesta.
Noumenon
Esto no funcionará para las líneas que son tan anchas que Notepad ++ lo trunca en la ventana de resultados de búsqueda.
MasterJoe2
4

Vaya al menú Buscar -> Buscar ... -> Activar expresiones regulares. Busque "^ Ruta " (^ es para inicio de línea).

Haga clic en el botón "Buscar todo en el documento actual".

La ventana "Buscar resultado" aparecerá con todas las líneas del patrón. Seleccione copiar / pegar en una nueva pestaña en Notepad ++.

En esta nueva pestaña, llegó a: menú Buscar -> Reemplazar ... -> Activar expresiones regulares.

En el campo "Buscar qué:", use el patrón: "Línea \ d +:". Deje en blanco el campo "Reemplazar con:".

Haga clic en el botón "Reemplazar todo".

Luis
fuente
3

Siempre que realmente desee hacer coincidir <Path>y no una ruta del sistema de archivos, puede probar esto desde una línea de comandos utilizando Perl:

perl -pe " if ($_ !~ /<Path>/) { s/$_// } " < in.txt > out.txt

Funcionó con Strawberry Perl en Windows, así que ajústelo en consecuencia si los resultados no son los esperados.

Joe Internet
fuente
3

Es torpe, pero cópielo todo en Excel y luego use =IF(LEFT(A1,6)="<Path>",A1,"")y copie esa fórmula hasta el final. Luego copie de nuevo a Notepad ++. No es ideal, pero es bastante fácil (si tiene Excel). Advertencia: no funcionará bien con líneas sangradas (Excel desplazará las columnas, etc.).

soandos
fuente
Cuando hay varias maneras de manejar esta tarea directamente, ¿por qué querría copiar destructivamente en otra aplicación, procesarla allí y transferirla de regreso?
Baldrickk
1

No hay una manera fácil de hacer lo que quieres con Notepad ++. Deberá descargar un programa en su computadora o escribir algo en VB (supongo que está en Windows).

Puedes hacer lo que quieras de dos maneras con sed. La utilidad sed es una de las favoritas en * nix y se puede encontrar para Windows de las grandes personas en GnuWin ( http://gnuwin32.sourceforge.net/packages/sed.htm ). Descargaría este programa y luego ejecutaría su comando desde el símbolo del sistema.

Eliminar todas las líneas que no contengan:
sed -i '/^<PATH>/!d' file

Imprima todas las líneas que contienen a un nuevo archivo:
sed -n '/^<PATH>/p' file > newfile

Le sugiero que use imprimir las líneas que desea para un nuevo archivo. La razón de esto es que probablemente no obtendrá la declaración regex por primera vez. La utilidad sed utiliza la sintaxis básica de expresiones regulares (vea la referencia en http://www.regular-expressions.info/reference.html ). Si es algo así como una ruta * nix (/ var / www), entonces deberá escapar del carácter / para que su expresión regular funcione.

Ejemplo: sed -n '/^\/var\/www/p' file > newfile
Esto imprimirá todas las líneas que comienzan con '/ var / www'. Si solicité escapar del carácter /, entonces el comando habría arrojado un error. Puede escapar de un carácter especial (como /) con el carácter de barra diagonal inversa \.

Chris Ting
fuente
Esta puede ser una respuesta antigua, pero dado que realmente tiene 2 votos (-1 ahora de mí) quería comentar no solo qué tan equivocado es, sino reiterar en una operación de comando ÚNICO cómo acabo (nuevamente) de tomar una línea> 100k registre el archivo en las 34 líneas que contienen la palabra (o frase) en este caso simplemente "error" en menos de 3 segundos simplemente colocando esta expresión regular en el ENCONTRAR QUÉ: ^ (?!. *? error). * \ r \ n y dejar REPLACE WITH en blanco, y NO seleccione ". coincide con la nueva línea" y haga clic en "REPLACE ALL". Sí, también me encanta sed y awk, pero decir que NPP no puede hacer esto es simplemente falso.
Collin Chaffin
1

Mejor solución con regex reemplazar:

(?!^.*SOMETEXT.*$)^.+\r?\n

Y reemplazar con nada

LoneDev
fuente
1
¡Bienvenido a Super User! ¿Te importaría explicar esto a aquellos que tal vez no sepan qué hace cada parte de la expresión regular? :)
bertieb
0

Use Buscar-> Reemplazar e ingrese una expresión regular como ^[^ ].*y reemplace todo con una cadena vacía usando Regular expression. El siguiente paso es encontrar líneas vacías que busquen \n\nreemplazar con el \nuso Extendedvarias veces hasta 0 occurrences were found.(uso \r\n\r\ny \r\ndependiendo del formato de archivo). Si tiene muchas líneas vacías seguidas, es más rápido usar \n\n\n\n\n\n\no incluso más \n: s en la cadena de búsqueda.

AndersTornkvist
fuente