您好我正在尝试找到一种方法来确定字符串中的常量,然后在该常量的左侧提取一定数量的字符。
例如 - 我有一个.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!"
,我将如何提取数字。
答案 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-String
(sls
)使用正则表达式00\d{3}
搜索包含字符00
的所有行,后跟三位数字并匹配整数。 .matches
和select
只会提取匹配行的部分。
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