在.txt文件

时间:2016-09-14 12:50:30

标签: string windows batch-file

您好我正在尝试找到一种方法来确定字符串中的常量,然后在该常量的左侧提取一定数量的字符。

例如 - 我有一个.txt文件,该文件中的某个位置有00nnn个数字的例子00234 00765 ....

所以我用

@echo off
findstr /i "00" *.txt > Listfile.txt
end

使用常量00

查找所有字符串

现在我有了

        00013       Jonas   Jonas
2015-12-09 12:36:41     Bell (waterproof)   
-   Technical Account
        00014       Jonas           Bell    
-   Technical Account
        00019       Jonas   Jonas
2016-09-12 09:11:12             T16032611   Technical Account
        00055   -   Jonas   Jonas
2016-04-29 08:05:14             T16041312   Technical Account
        00057       Jonas   Jonas
2016-04-04 14:36:50             T15123112   Technical Account
        00067       Jonas   Jonas
2016-06-24 09:33:35             T15123112   Technical Account
    00570       Jonas                   T16041312   Technical Account
        00571       Jonas                   T16041312   Technical Account
        00572       Jonas                   T16041312   Technical Account
        00573       Jonas                   T16041312   Technical Account
        00574       Jonas                   T16041312   Technical Account
        00575       Jonas                   T16041312   Technical Account
        00576       Jonas                   T16041312   Technical Account
        00577       Jonas                   T16041312   Technical Account
        00578       Jonas                   T16041312   Technical 

接下来我尝试了:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
(
FOR /f "delims=" %%a IN (test.txt) DO (
 SET "line=%%a"
 SET "digits=5!line:~-0,5!"
 FOR /L %%z IN (0,1,5) DO SET "digits=!digits:%%z=!"
 IF NOT DEFINED digits ECHO(!line:~0,5!
)
)>newfile.txt

GOTO :EOF

但是,我的问题是字符串中有空格,如果某些字符串以"digits=5!line:~-0,5!"开头,其他字符串位于"digits=13!line:~-8,13!",我将如何提取数字。

4 个答案:

答案 0 :(得分:3)

@echo off
setlocal EnableDelayedExpansion

for /F "delims=" %%a in (test.txt) do (
   set "line=%%a"
   for /F %%b in ("!line:*00=!") do echo 00%%b
)

输入数据每行应一个 00nnn个数,因此我以这种方式重新格式化了您的示例数据:

        00013       Jonas   Jonas
2015-12-09 12:36:41     Bell (waterproof)   -   Technical Account        00014       Jonas           Bell    
-   Technical Account        00019       Jonas   Jonas
2016-09-12 09:11:12             T16032611   Technical Account        00055   -   Jonas   Jonas
2016-04-29 08:05:14             T16041312   Technical Account        00057       Jonas   Jonas
2016-04-04 14:36:50             T15123112   Technical Account        00067       Jonas   Jonas
2016-06-24 09:33:35             T15123112   Technical Account    00570       Jonas                   T16041312   Technical Account
        00571       Jonas                   T16041312   Technical Account
        00572       Jonas                   T16041312   Technical Account
        00573       Jonas                   T16041312   Technical Account
        00574       Jonas                   T16041312   Technical Account
        00575       Jonas                   T16041312   Technical Account
        00576       Jonas                   T16041312   Technical Account
        00577       Jonas                   T16041312   Technical Account
        00578       Jonas                   T16041312   Technical 

输出示例:

00013
00014
00019
00055
00057
00067
00570
00571
00572
00573
00574
00575
00576
00577
00578

编辑使用JScript添加新方法

我的第一个答案是使用一个小的批处理文件来解决这个问题的简单方法。但是,现在其他答案已建议使用正则表达式,您应该知道您不需要使用非标准实用程序(如grep)或PowerShell来使用简单的正则表达式批处理文件。您可以在XP的所有Windows版本上使用预先安装的几行JScript language

@if (@CodeSection == @Batch) @then

@echo off
cscript //nologo //E:JScript "%~F0" < test.txt
goto :EOF

@end

var match, search = /00\d{3}/g, file = WScript.StdIn.ReadAll();
while ( match = search.exec(file) ) WScript.Stdout.WriteLine(match[0]);

将此代码复制到批处理文件(.bat扩展名)中;此代码比PowerShell解决方案运行更快。您还可以使用下一行获得问题的完整解决方案,该行检查所有* .txt文件并在一次操作中提取数字:

findstr /i "00" *.txt | cscript //nologo //E:JScript "%~F0"

答案 1 :(得分:2)

您可以通过调用PowerShell并使用Select-String cmdlet执行与grep相同的操作来使用正则表达式(来自Mark Setchell's answer)。

powershell -c "(sls '00\d{3}' YourFile).matches | select -exp value"

Select-Stringsls)使用正则表达式00\d{3}搜索包含字符00的所有行,后跟三位数字并匹配整数。 .matchesselect只会提取匹配行的部分。

输出

00013
00014
00019
00055
00057
00067
00570
00571
00572
00573
00574
00575
00576
00577
00578

PowerShell安装在每台Windows PC上;无需安装任何第三方程序。

答案 2 :(得分:1)

提取以00开头的所有数字(假设它们之前只有空格或标签):

 for /f %%a in ('type *.txt^|find "00"') do echo %%a

答案 3 :(得分:1)

Windows 安装 GNU grep 并运行:

grep -Eo "00\d{3}" YourFile

查找“00”后跟正好3位数(\d{3})并且只显示(-o)打印匹配行的部分。

<强>输出

00013
00014
00019
00055
00057
00067
00570
00571
00572
00573
00574
00575
00576
00577
00578