La secuencia de comandos por lotes a continuación es para formatear un archivo de texto que funciona bien hasta ahora.

Una cadena que consiste en cualquier carácter de palabra o punto o guión se interpreta como palabra en este contexto.

Existe el requisito de insertar NODATA como la última pero una palabra si la cadena que queda para la última palabra no es ninguna de las siguientes cadenas que se deben buscar respectivamente en comparación sin distinción entre mayúsculas y minúsculas:

  • API
  • Server Module
  • Version

Ejemplo de datos de entrada:

Check Masterdata API 3.1.8 
Core Server Module 3.1.8-P02 
Check Subsystem version 3.1.8-11P 
Core resources 1.2.1

Datos de salida esperados:

Check Masterdata API 3.1.8 
Core Server Module 3.1.8-P02 
Check Subsystem version 3.1.8-11P 
Core resources NODATA 1.2.1

No tengo idea de qué código agregar al archivo por lotes para este requisito debido al conocimiento puro de las expresiones regulares. Creo que podría hacerse también con jrepl.bat.

¿Alguien tiene una sugerencia para agregar una línea de comando jrepl.bat adecuada sobre la llamada existente de este archivo por lotes para insertar NODATA en la posición correcta en las líneas correctas?

Guión:

call "%~dp0jrepl.bat" "[^\w.\-]+([\w.\-]+)[^\w.\-]+([\w.\-]+)$" ",$1,$2" /F "%tempFile2%" /O "%tempFile3%"
0
Deepti 20 oct. 2017 a las 15:55

3 respuestas

La mejor respuesta

Sugiero agregar las siguientes dos líneas sobre la línea que ya llama jrepl.bat.

call "%~dp0jrepl.bat" "\b([\w.\-]+)$" "NODATA $1" /F "%tempFile2%" /O -
call "%~dp0jrepl.bat" "(API|Server Module|Version)[\t ]+NODATA" "$1" /I /F "%tempFile2%" /O -

La primera línea da como resultado la inserción de NODATA izquierda a la última palabra en todas las líneas del archivo temporal 2.

La segunda línea busca mayúsculas y minúsculas para API o Server Module o Version en un grupo de marcado / captura seguido de 1 o más pestañas o espacios y justo antes de insertar NODATA. El reemplazo elimina las pestañas / espacios y NODATA y mantiene API o Server Module o Version como se encuentra en el línea.

0
Mofi 20 oct. 2017 a las 14:24

Espero no estar malinterpretando su objetivo de salida deseado.

Dada su aportación de.

Check Masterdata API 3.1.8 
Core Server Module 3.1.8-P02 
Check Subsystem version 3.1.8-11P 
Core resources 1.2.1

Puede utilizar este código:

@echo off
setlocal enabledelayedexpansion

FOR /F "delims=" %%G IN (input.txt) DO (
        SET "line=%%G"
        SET "line=!line:api=!"
        SET "line=!line:server module=!"
        SET "line=!line:version=!"
        IF "%%G"=="!line!" (
            CALL :NODATA "%%G"
        ) ELSE (
            echo %%G
        )
)
pause
GOTO :EOF

:NODATA
set i=0
set "x=%~1"
set "xb=%x: =" & set "xl=%"
set "newline=!x:%xl%=NODATA %xl%!"
echo %newline%
goto :EOF

Y esta es la salida que obtengo de ella.

Check Masterdata API 3.1.8
Core Server Module 3.1.8-P02
Check Subsystem version 3.1.8-11P
Core resources NODATA 1.2.1

Tiene tanto código en su pregunta original, no estoy realmente seguro de dónde lo necesita en su código. Acabo de codificar según su ejemplo de entrada y salida.

0
Squashman 20 oct. 2017 a las 19:23

En la sección de código con la que necesitaba ayuda, utilicé la expansión retrasada, las comillas dobles y la sangría en aquellas áreas donde no lo había hecho y evité hacer eco de un espacio final innecesario en temp.txt.

rem Not Working Starts

for /f "delims=" %%j in (%tempFile2%) do (
    set "Fileline=%%j"
    set "Fileline_API=!Fileline:API=!"
    set "Fileline_Client=!Fileline:Client=!"
    set "Fileline_ServerModule=!Fileline:Server module=!"
    set "Fileline_Component=!Fileline:Component=!"
    set "Fileline_GlobalsModule=!Fileline:Globals module=!"
    set "Fileline_ClientBaseModule=!Fileline:Client base module=!"
    set "Fileline_GlobalBaseModule=!Fileline:Global base module=!"
    set "Fileline_ServerBaseModule=!Fileline:Server base module=!"
    set "Fileline_Global=!Fileline:Global=!"

    if "!Fileline!"=="!Fileline_API!" (
        if "!Fileline!"=="!Fileline_Client!" (
            if "!Fileline!"=="!Fileline_ServerModule!" (
                if "!Fileline!"=="!Fileline_Component!" (
                    if "!Fileline!"=="!Fileline_GlobalsModule!" (
                        if "!Fileline!"=="!Fileline_ClientBaseModule!" (
                            if "!Fileline!"=="!Fileline_GlobalBaseModule!" (
                                if "!Fileline!"=="!Fileline_ServerBaseModule!" (
                                    if "!Fileline!"=="!Fileline_Global!" (
                                        >temp.txt echo !Fileline!

                                        rem Section to get the last word but one and do if else conditions

                                    )
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)

rem Not Working Ends

Como no parece necesitar muchas de las variables en otra parte de su script, por supuesto, podría acortarlo aún más.

rem Not Working Starts

for /f "delims=" %%j in (%tempFile2%) do (
    set "Fileline=%%j"
    if "%%j"=="!Fileline:API=!" (
        if "%%j"=="!Fileline:Client=!" (
            if "%%j"=="!Fileline:Server module=!" (
                if "%%j"=="!Fileline:Component=!" (
                    if "%%j"=="!Fileline:Globals module=!" (
                        if "%%j"=="!Fileline:Client base module=!" (
                            if "%%j"=="!Fileline:Global base module=!" (
                                if "%%j"=="Fileline:Server base module=!" (
                                    if "%%j"=="!Fileline:Global=!" (
                                        >temp.txt echo %%j

                                        rem Section to get the last word but one and do if else conditions

                                    )
                                )
                            )
                        )
                    )
                )
            )
        )
    )
)

rem Not Working Ends

Sin embargo, cualquier problema que pueda existir en su lógica, etc. está fuera del alcance de estas respuestas.

0
Compo 20 oct. 2017 a las 15:24