下面的批处理脚本用于重新格式化到目前为止运行良好的文本文件。
在此上下文中,由任何单词字符或点或连字符组成的字符串将被解释为单词。
如果要留下的最后一个字的字符串不是以下应该搜索的字符串,则需要插入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%"
答案 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
你原来的问题中有很多代码,我不确定你的代码中需要它的位置。我只根据您的输入和输出示例进行编码。