Analizar cadena usando script por lotes

Analizar cadena usando script por lotes

¿Cómo puedo analizar una cadena usando un script por lotes?

El objetivo es guardar en una matriz todo lo que hay debajo Import:y eliminarlo, #headpor ejemplo --> //MPackages/Project/config/abc.txty //Packages/Project/config/cde.txt.

prueba.txt:

Version: 4.5.0
Import:
   //MPackages/Project/config/abc.txt                       #head
   //Packages/Project/config/cde.txt                        #head
View:
  //MPackages/Project/config/ac.txt                     #head
  //Packages/Project/config/de.txt                      #head

Mi intento:

@echo off

set buildlog="devel.p4inc"

setlocal EnableDelayedExpansion
for /F "tokens=*" %%A in  (devel.p4inc) do  (
  if /i "%%A"=="Import:" set "import=true"
  IF DEFINED import (echo %%A)
)

salida deseada

   //MPackages/Project/config/abc.txt 
   //Packages/Project/config/cde.txt

cualquier cosa bajo Importar:

Respuesta1

Uno de los principales problemas en su lógica es que configura la variable "importar" una vez si algo es cierto, pero nunca la restablece o la desdefini si ya no es cierto. Entonces, después de configurarlo por primera vez, permanecerá "definido" durante el resto del ciclo.

Mi preferencia es establecer la variable específicamente ( trueo false). Configúrelo para falsecomenzar, luego configúrelo truecomo desee, pero también asegúrese de volver a configurarlo falsecuando lo necesite. Luego, en cada iteración del bucle, verifique si la variable está configurada específicamente en Trueo Falseen lugar de verificar si recién está definida.

Este código funciona para mí según su información/objetivos:

@echo off

setlocal EnableDelayedExpansion

set buildlog=test.txt
set import=false

for /F "tokens=*" %%A in (%buildlog%) do (
    if /i "%%A"=="Import:" (
        set import=true
    )
    if /i "%%A"=="View:" (
        set import=false
    )
    if !import!==true (
        if not "%%A"=="Import:" (
            for /F "tokens=1" %%B in ("%%A") do (
                echo %%B
            )
        )
    )
)

Configuramos intencionalmente la variable "Importar" (bandera) para falsecomenzar.

El primer bucle For recorre cada línea del archivo ( test.txten este ejemplo, según lo especificado por la variable "buildlog"; nota: debe eliminar las comillas alrededor del nombre del archivo en la variable para que funcione en el bucle For) .

El primer IF ve si la línea actual es la línea "Importar:" y, de ser así, cambia el indicador "importar" a true.

El siguiente IF ve si la línea actual es la línea "Ver:" y, de ser así, cambia el indicador "importar" (de nuevo a) false, para que deje de procesar cada línea.

El tercer IF verifica si ese indicador de "importación" es truey, de ser así, procesa la línea.

Si es trueasí, entonces el IF anidado (cuarto) verifica si la línea es la línea "importar:" real y, si no, muestra la línea (evita que muestre la línea "Importar:" en la salida).

El segundo bucle For recorre la línea que queremos que se muestre y extrae solo el primer conjunto de tokens que es (solo) la ruta que desea, dejando fuera el archivo #head.

Más/información relacionada:

Editar después de los comentarios:

Para tratar con la línea "Ver:" si tiene un número de versión después, puede modificar el código a algo como:

@echo off

setlocal EnableDelayedExpansion

set buildlog=test.txt
set import=false

for /F "tokens=*" %%A in (%buildlog%) do (
    for /F "tokens=1" %%B in ("%%A") do (
        if /i "%%B"=="Import:" (
            set import=true
        )
        if /i "%%B"=="View:" (
            set import=false
        )
        if !import!==true (
            if not "%%B"=="Import:" (
                for /F "tokens=1" %%C in ("%%A") do (
                    echo %%C
                )
            )
        )
    )
)

Este bucle For agregado extraerá el primer token de la línea para verificar si es "Ver:" o "Importar:" en lugar de verificar toda la línea. Ignorando efectivamente cualquier cosa después del primer espacio que encuentra en la línea para realizar la verificación.

Respuesta2

@echo off
for /F "usebackq tokens=1" %%A in  ("devel.p4inc") do  (
Set temp=False
if "%%A" == "View:" Goto Exit
if  not "%%A" == "Import:" if  not "%%A" == "Version:"  echo %%A
)
:Exit

Respuesta3

línea de comando:

powershell [string]$f=gc test.txt;$pL=$f.IndexOf('Import:')+7;$pR=$f.IndexOf('View:');$s=$f.Substring($pL,$pR-$pL);$s -split'#head'^|ac result.txt

potencia Shell:

powershell ./parsefl.ps1

parsefl.ps1

[string]$f=gc test.txt;
$pL=$f.IndexOf('Import:')+'Import:'.Length;$pR=$f.IndexOf('View:');
$s=$f.Substring($pL,$pR-$pL);
$s -split'#head'|ac result.txt

información relacionada