es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pregunta de Powershell: ¿Cómo puedo eliminar líneas a partir de una posición determinada?

Tengo 2 preguntas:

  1. Pregunta:
    Tengo un archivo .txt y busco con PowerShell una palabra en él:

Mi código:

Select-String .\example.txt -pattern "myword" | select -ExpandProperty line

Muy bien. PowerShell encontró la palabra dentro de la línea 63.
Después de la línea 63, el archivo .txt tiene x líneas más, y todas ellas deberían eliminarse.
¿Cómo se puede hacer esto?

get-content .\example.txt | select-string -pattern 'myword' -notmatch | Out-File .\new_example.txt

Esto solo eliminó la línea 63. Sin embargo, esta debería permanecer y solo el resto debería eliminarse.

  1. Pregunta:
    Casi lo mismo. Busco dos conteos, Ejemplo: 12 y 33 en el .txt
    PowerShell no encontró 12a y 33a.
    Está bien. PowerShell debería buscar “11a hasta 56a” y limpiar las líneas “10a” y “123a”.

Archivo .txt de ejemplo:

10a,
11a,
21a,
20w,
32a,
56a,
123a,

El archivo .txt deseado:

11a,
21a,
20w,
32a,
56a,

¿Cómo puedo hacerlo? Espero mucho que puedas ayudarme con estos problemas.
Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Respuestas:

    1. Para eliminar todas las líneas después de la línea 63 en el archivo .txt, se puede usar el siguiente código:
      $file = '.\ejemplo.txt'
      $contenido = Get-Content $file
      $startIndex = (Select-String $file -pattern 'mi_palabra').LineNumber - 1
      $contenido | Select-Object -First $startIndex | Out-File -FilePath '.\nuevo_ejemplo.txt'
      

      Aquí, primero obtenemos el contenido del archivo en la variable $contenido. Luego encontramos el número de línea de la palabra buscada usando Select-String y restamos 1 para obtener el índice de la última línea que queremos conservar. Luego usamos Select-Object para seleccionar solo las líneas hasta ese índice y lo enviamos a un nuevo archivo usando Out-File. Esto creará un nuevo archivo solo con las líneas deseadas.

    2. Para buscar dos conteos (12 y 33) y excluir líneas que contengan 12a y 33a, se puede usar el siguiente código:

      $file = '.\ejemplo.txt'
      $contenido = Get-Content $file
      $contenido | Where-Object { $_ -notmatch '12a|33a' -and $_ -match '(\b1[2-9]|2[0-9]|3[0-3])a' } | Out-File -FilePath '.\nuevo_ejemplo.txt'
      

      Aquí, usamos Get-Content para obtener el contenido del archivo en la variable $contenido. Luego enviamos esto a un filtro Where-Object para excluir las líneas que contengan 12a y 33a usando el operador -notmatch. También usamos el operador -match para buscar líneas que contengan 12 o 33, pero con una letra a inmediatamente después, usando el patrón regex (\b1[2-9]|2[0-9]|3[0-3])a. Esto coincidirá con cualquier número entre 12 y 33, seguido de la letra a. Luego enviamos las líneas filtradas a un nuevo archivo usando Out-File. Esto creará un nuevo archivo solo con las líneas deseadas.

Comments are closed.