如何根据字符串之前在某些行中的最后一个单词之前插入字符串NODATA?
下面的批处理脚本用于重新格式化目前运行良好的文本文件。如何根据字符串之前在某些行中的最后一个单词之前插入字符串NODATA?
在此上下文中,由任何单词字符或点或连字符组成的字符串被解释为单词。
有插入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%"
我建议在已经调用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 -
中插入NODATA
第一行结果却让持续在临时文件2中的所有行字。
第二行用于API
或Server Module
或Version
在标记/捕获组随后用1个或多个凸块或空间和刚插入之前NODATA
搜索不区分大小写的。替换删除标签/空格和NODATA
并保持API
或Server Module
或Version
如在行中找到。
非常感谢,它的工作 – Deepti
在代码中你需要帮助的部分,我用延迟扩展,双引号和缩进在你没有和防止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
其可以在逻辑等存在的任何问题是这些答案的范围之外。
希望我没有误解你的期望的输出目标。
鉴于你的输入。
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
你在你原来的问题有这么多的代码,我真的不知道你需要这在你的代码。我只是根据你的输入输出例子进行编码。
非常感谢,它的工作 – Deepti
“我需要”是不是一个问题,因此,请阅读[旅游]和学习[问]! – aschipfl
那么你是说你的所有输入行应该有三个单词,然后是一个版本代码?如果它没有三个单词,那么添加单词NODATA作为第三个单词? – Squashman
@Squashman,不,如果最后一个字之前的字不是API(或)服务器模块(或)版本,那么我应该最后一个字前加上NODATA。 – Deepti