如何根据字符串之前在某些行中的最后一个单词之前插入字符串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%" 
+1

“我需要”是不是一个问题,因此,请阅读[旅游]和学习[问]! – aschipfl

+0

那么你是说你的所有输入行应该有三个单词,然后是一个版本代码?如果它没有三个单词,那么添加单词NODATA作为第三个单词? – Squashman

+0

@Squashman,不,如果最后一个字之前的字不是API(或)服务器模块(或)版本,那么我应该最后一个字前加上NODATA。 – Deepti

我建议在已经调用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中的所有行

第二行用于APIServer ModuleVersion在标记/捕获组随后用1个或多个凸块或空间和刚插入之前NODATA搜索不区分大小写的。替换删除标签/空格和NODATA并保持APIServer ModuleVersion如在行中找到。

+0

非常感谢,它的工作 – 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 

你在你原来的问题有这么多的代码,我真的不知道你需要这在你的代码。我只是根据你的输入输出例子进行编码。

+0

非常感谢,它的工作 – Deepti