如何使程序正确运行

时间:2019-04-25 08:23:00

标签: batch-file cmd

此程序使文件out1.txt中的所有字符串反向 工作错了。在result.txt中,我发现最后一个字符串输入错误 020701BT ,后跟 020701BT

如何正确反转文本文件

%{
#include <iostream>
using namespace std;
#define YY_DECL extern "C" int yylex()
%}
%%
[ \t\n]         ;
[0-9]+\.[0-9]+  { cout << "Found a floating-point number:" << yytext                         << endl;   }
[0-9]+          { cout << "Found an integer:" << yytext << endl; }
[a-zA-Z0-9]+    { cout << "Found a string: " << yytext << endl; }
%%
 int main(int, char**) {
    // lex through the input:
    yylex();
}

out1.txt-输入文件

020701BT

<> 710f7fa45c6911e9648d2cfda1bf577d

020701BT

<> cde9bde81a5b11e96b882cfda1bf577d

020701BT

<> d266b9021a5b11e96b882cfda1bf577d

040109GT

result.txt输出文件,最后有错误

<> cde9bde81a5b11e96b882cfda1bf577d

020701BT

<> 710f7fa45c6911e9648d2cfda1bf577d

020701BT

020701BT

2 个答案:

答案 0 :(得分:1)

Gerhard Barnard的答案有效(将输出重定向到新文件之后)
并且通常应使用XML工具来处理XML文件,

我建议使用带有正则表达式和lookarounds的PowerShell脚本

RE的优点是它独立于职位运行,只需要定义的前缀/后缀即可。

要成为主题,以cmd行/批次包裹

powershell -NoP -C "(Get-Content .\goods.xml -raw) -replace '(?<=\<frame\>)..(?=/)'|Set-Content .\goods.xml"

这里是RegEx (?<=\<frame\>)..(?=/)

  • 删除任何两个字符..
  • 以紧随其后的长度为零的肯定断言中的文字文本<frame>开头
  • ,后跟一个包含在零长度正向超前断言中的文字/

答案 1 :(得分:0)

根据您的解释(而不是代码),您似乎只想摆脱<frame>/之间的两个字符

所以这个答案是基于此,而不是您的代码,因为这似乎有所不同。

我们可以使用findstr使用正则表达式来实现这一点,删除字符并再次缝合字符串。

@echo off
set "inputfile=goods.xml"
for /f "tokens=1,* delims=>" %%i in ('findstr /R "<frame>[0-9a-F][0-9a-F]/[^/]*" "%inputfile%"') do (
   set reg=%%j

for /f "tokens=*" %%a in ('type "%inputfile%" ^| find /v /n "" ^& break ^> "%inputfile%"') do (
     set "str=%%a"
     call set "str=%%str:*]=%%"
     setlocal enabledelayedexpansion
     if "!str!" == "%%i>!reg!" ( 
          set "reg=!reg:*/=!"
          set "str=%%i^>!reg!"
       )
     >>%inputfile% echo(!str!
    endlocal
   )
)