CMD:尝试使用正则表达式从文件中获取子字符串

时间:2016-10-16 14:41:02

标签: regex batch-file cmd

我有一个脚本使用wget下载某个文件test.txt,其中包含以下内容:

  

{" orderNumber":" 1476628690_2WOSU1OR"}<

我只想要ordernumber本身,而不是它周围的所有文字。我用谷歌搜索了它,并找到了findstr和forloops类似问题的许多答案,但由于我是一个完整的批处理新手,我对此并不了解。

是否有接受正则表达式和输入文件的函数并将文件更改为其他内容?

3 个答案:

答案 0 :(得分:0)

您是说要重新编写文件,只包含订单号并删除所有其他文字?

在此之前或之后是否有任何其他字符可能是他的行或者该行总是只是字符 {" orderNumber":" 1476628690_2WOSU1OR"}<

假设您要重写整个文件以仅包含订单号,并且沿着行的标记始终被格式化为您的示例输入。那么以下是合理的:

在命令行:

for /f tokens^=4^ delims^=^"  %A IN ('type "C:\Admin\Stack_Exchange\40071522\test.txt" ^| FIND /I "OrderNumber" ') DO @( Echo.%~A>"C:\Admin\Stack_Exchange\40071522\test.txt"&exit /b)

我实际上假设您可能正在调用批处理文件" Reorder.cmd"并将文件的路径作为唯一的参数。

在批处理文件中:

REM Script: Reorder.cmd
FOR /F Tokens^=4^ Delims^=^"  %%A IN ('Type "%*" ^| FIND /I "OrderNumber" ') DO (
 Echo.%%~A>"%*"
 GOTO :EOF
)

生成的文本文件内容:

1476628690_2WOSU1OR

答案 1 :(得分:0)

由于txt文件与我的.cmd脚本位于同一文件夹中,因此我将其创建: for / f令牌^ = 4 ^ delims ^ = ^“%A IN('type”test.txt“^ | FIND / I”OrderNumber“')DO @(Echo。%~A>”test.txt“&退出/ b)

但它不会删除其余部分。我把它自己放在一个脚本中:GetNumber.cmd并运行了几次,但txt文件说的相同。

答案 2 :(得分:0)

我无法回复你的评论,因为我只有41分(显然需要50分)所以我必须将我的评论作为另一个答案发表。

  

由于txt文件与我的.cmd脚本位于同一文件夹中,因此我将其创建:   for / f tokens ^ = 4 ^ delims ^ = ^“%A IN('type”test.txt“^ | FIND / I   “OrderNumber”')DO @(Echo。%~A>“test.txt”& exit / b)

     

但它不会删除其余部分。我把它自己放在一个脚本中:   GetNumber.cmd并运行了几次,但txt文件说明了   相同。

我可以向您保证代码可以正常运行并在Windows 7,2008 R2和2012 R2中进行测试,但是我很久以前就像Windows 2000一样使用了相同类型的代码。

根据您的回复我发现您对代码如何工作以及应该在何处运行存在一些混淆,我不确定我是否可以在下面为您澄清,或者是否更容易尝试成为更明确,所以我在下面做了两个。

为什么你的尝试不起作用:

您在.cmd文件中提到的第一个代码无法在批处理文件中正确运行(Windows CMD需要在批处理/ CMD文件中进行额外的转义,这在cmd提示符下无效)。

此代码旨在通过直接粘贴到CMD提示符来运行,并要求您使用完整路径或首先将“CD”放入同一文件夹

以下几种方法可以做同样的事情,我会更明确地说明如何使用它们来实现目标,以及需要提供哪些信息。

要在CMD提示符(非.bat / .cmd文件)中尝试此操作,请在此处替换[YOUR_PATH]项目,然后直接粘贴到CMD提示符中。

for /f tokens^=4^ delims^=^" %A IN ('type "[YOUR_PATH]\test.txt" ^| FIND /I "OrderNumber" ') DO @( Echo.%~A>"[YOUR_PATH]\test.txt"&exit /b)

您似乎想要对文件进行硬编码并从批处理文件调用,在这里我重新编写您提到的“GetNumber.cmd”,以满足您的需求。请再次指定cmd文件中变量的完整路径,否则无效

REM Script: GetNumber.cmd
SET "FullPathAndFileName=[YOUR_PATH]\test.txt"
FOR /F Tokens^=4^ Delims^=^"  %%A IN ('Type "%FullPathAndFileName%" ^| FIND /I "OrderNumber" ') DO (
 Echo.%%~A>"%FullPathAndFileName%"
 GOTO :EOF
)

在原版中,我向你提供了这个适用于任何文件位置的CMD版本 - 只需将文件拖放到.cmd文件上进行测试即可。 - 或者您也可以从CMD调用批处理文件并将完整路径作为参数放入:Reorder.cmd [YOUR_PATH] \ test.txt

REM Script: Reorder.cmd
FOR /F Tokens^=4^ Delims^=^"  %%A IN ('Type "%*" ^| FIND /I "OrderNumber" ') DO (
 Echo.%%~A>"%*"
 GOTO :EOF
)

以下是我的测试文件的前后内容:

之前:

Hello there" Some stuff here"
"
""
{"orderNumber": "1476628690_2WOSU1OR"}<
more stuff here
the end
C:\Admin\Stack_Exchange\40071522

后:

1476628690_2WOSU1OR