我有一组数据
7859 10000:00 7859 10000:00(传送器#1,待检查=1033/1035)
32768 000:17 22174479 10000:00(传送器#2,待检查=1032/1035)
它们是从文件中读取的,并逐行传递给批处理脚本中的一个方法。在该方法中,我想做的是只提取
7859
22174479
从这几行开始,基本上不管“\d+:\d\d\s+"后面是什么,接下来就是我需要的数字,然后是另一个“\d\d.*”
这是可能的只使用批处理脚本正则表达式和搜索和替换?我尝试和阅读了一堆文章,但无法找到一个解决方案,我想添加的数字
谢谢你
编辑
- 根据Andrei对大卫Ruhmann答案的评论,Andrei想要的是
(xfer#
前2位的令牌,而不是从开头算起的第3个令牌。*
4条答案
按热度按时间qpgpyjmq1#
请注意,批处理不是用于regex的最佳语言!Cmd一次处理一行输入,而regex允许多行处理。
听起来你只需要从这些行中执行一个令牌抓取。假设该行的更完整的正则表达式看起来像
[\d+\s+\d+:\d\d\s+]+\(xfer#\d+, to-check=\d+/\d+\)
。这让我们知道行中有常量分隔符。
:
冒号和\s+
空格,从那里我们只需要使用这些锚来确定标记的位置。从行中撷取以单行空白分隔的第三个词语基元。
从行中以冒号分隔的第二个词语基元,撷取以单行空白分隔的第二个词语基元。
更新
提取最后一个冒号之前的第二个标记。
限制
1.包含奇数个双引号
"
的行将导致脚本崩溃。防止这种情况的一个方法是用set Line=%Line:"=%
去掉for循环前面的引号。cgyqldqp2#
根据您对大卫Ruhmann答案的评论,您需要
(xfer#
字符串前2个位置的标记。我想可以使用本地批处理命令来完成,但这是一个严重的问题。我假设您仅限于Windows自带的命令-没有下载的可执行文件。
我希望您可以使用JScript,因为它是Windows自带的。
我写了一个混合JScript/Batch实用程序脚本,名为“REPL.BAT”,它执行regex搜索和替换。这是一个非常有用的实用程序,尽管不需要太多代码。该实用程序使解决方案非常简单。
我使用FINDSTR过滤掉不符合模板的行,模板中至少有2个以空格分隔的标记位于
(xfer#
之前。我将这些结果通过管道传送到REPL实用程序,只保留所需的标记。结果被发送到stdout。下面是REPL.BAT实用程序脚本的代码。完整的文档都嵌入在脚本中。
f0brbegy3#
lmyy7pcs4#
要完成所需操作,最简单、最灵活的方法是使用awk(regexp examples)或sed(例如:
sed -i -r -e "s/(\d+:\d\d\s+)\d+/\1replacementstring/g" filename
),这两个版本都支持Perl regexp语法。我认为您所涉及的正是awk的设计目的。如果您只能使用可用的工具而不能使用第三方工具,您可以使用vbscript执行regexp匹配。您可以通过将脚本回显到.vbs文件、调用cscript vbsfile并捕获其输出来调用vbscript。下面是概念证明。
示例输出: