如何在某些行中的最后一个字之前插入字符串NODATA,具体取决于之前的字符串?

时间:2017-10-20 12:55:41

标签: windows batch-file

下面的批处理脚本用于重新格式化到目前为止运行良好的文本文件。

在此上下文中,由任何单词字符或点或连字符组成的字符串将被解释为单词

如果要留下的最后一个的字符串不是以下应该搜索的字符串,则需要插入NODATA作为最后一个分别比较不区分大小写:

  • API
  • Server Module
  • Version

输入数据示例:

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

预期输出数据:

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

由于对正则表达式的纯粹了解,我不知道将哪个代码添加到批处理文件中以满足此要求。我认为也可以使用jrepl.bat来完成。

是否有人建议在此批处理文件的现有调用之上添加适当的jrepl.bat命令行,以便在右侧的正确位置插入NODATA

脚本:

call "%~dp0jrepl.bat" "[^\w.\-]+([\w.\-]+)[^\w.\-]+([\w.\-]+)$" ",$1,$2" /F "%tempFile2%" /O "%tempFile3%"

3 个答案:

答案 0 :(得分:0)

在您需要帮助的代码部分中,我在那些您没有帮助的区域使用了延迟扩展,双引号和缩进,并阻止在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

由于您似乎不需要脚本中的其他变量,您当然可以进一步缩短它。

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

您的逻辑等中可能存在的任何问题都不属于这些答案的范围。

答案 1 :(得分:0)

我建议在调用已经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 -

第一行导致在临时文件2的所有行中向前插入NODATA到最后

第二行搜索标记/捕获组中的API Server Module Version不区分大小写插入NODATA之前的一个或多个标签或空格。替换删除标签/空格NODATA并保留API Server Module Version线。

答案 2 :(得分:0)

希望我不会误解你想要的输出目标。

鉴于您的输入。

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

您可以使用此代码:

@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

这是我得到的输出。

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

你原来的问题中有很多代码,我不确定你的代码中需要它的位置。我只根据您的输入和输出示例进行编码。