首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用findstr和正则表达式搜索字符串的区段

使用findstr和正则表达式搜索字符串的区段
EN

Stack Overflow用户
提问于 2012-10-15 18:22:43
回答 1查看 4.6K关注 0票数 0

我创建了代码,循环遍历files.txt的每一行,识别文件是carboat还是neither,并将这些信息存储到SendType.txt中。这是通过使用findstr命令并通过boat.txtcar.txt列表进行搜索来实现的。本质上,代码的设计方式是,它将接受files.txt的第一行,看看它是否能够在car.txt中找到字符串(如果car被输出到SendType.txt中),它将在boat.txt中搜索字符串(如果在boat.txt中找到字符串,则boat被输出到SendType.txt),如果字符串没有在car.txt或boat.txt中找到,则文本< code >D17输出到SendType.txt

现在,代码搜索整个字符串行。每个字符串都类似于11111_2222-22_2010-09-09_10-24-20.zip (11111=ID、2222-22=model、2010-09-09=date、10-24-20=transaction ID)。

我想替换搜索整行的当前findstr行,以搜索除日期部分以外的整个字符串。我已经附上了我的代码,以供参考,以及一些例子的文件正在输入。提前感谢!

代码语言:javascript
复制
@echo off
FOR /F %%a in (files.txt) do (
findstr %%a car.txt
if errorlevel 1 (
findstr %%a boat.txt
    if errorlevel 1 (
    echo neither >>SendType.txt
) else (
    echo boat >>SendType.txt
)
) else (
    echo car >>SendType.txt
)
)

代码语言:javascript
复制
car.txt
11111_2222-22_2010-09-09_10-24-20.zip
11112_2222-11_2011-11-09_10-24-25.zip

代码语言:javascript
复制
boat.txt
11122_1111-22_2012-04-09_11-29-56.zip
11144_3333-11_2011-12-22_06-29-66.zip

代码语言:javascript
复制
files.txt
11122_1111-22_2000-01-01_11-29-56.zip
11144_3333-11_2000-01-01_06-29-66.zip
11155_1212-12_2000-01-01_11-19-69.zip
11111_2222-22_2000-01-01_10-24-20.zip
11112_2222-11_2000-01-01_10-24-25.zip
12345_2233-12_2000-01-01_07-27-44.zip

期望产出:

代码语言:javascript
复制
SendType.txt
boat
boat
neither
car
car
neither

更新10/15 3:00 PM当前使用dbenham代码和解析技术的方法如下:

代码语言:javascript
复制
@echo off    
>SendType.txt (  
for /f "tokens=1,2,3,4 delims=_" %%a in (filenames.txt) do (    
findstr /c:"%%a_%%b_%%d" sneakernet.txt >nul && (echo sneakernet) || (      
findstr /c:"%%a_%%b_%%d" devmed.txt >nul && (echo devmed) || echo tanto   
       ) 
    )
)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-15 20:50:34

如果If的格式固定在日期之前的两个_中,那么解决方案很简单:只需使用/F来解析值。

我喜欢使用&&||,而不是测试ERRORLEVEL。另外,您不需要FINDSTR的输出,因此可以重定向到nul。您应该验证字符串从行开始时是否匹配。最后,您只需要重定向一次,这样就可以覆盖而不是追加--更容易重复测试,因为在开始之前不需要删除。

代码语言:javascript
复制
@echo off
>SendType.txt (
  for /f "tokens=1,2 delims=_" %%a in (files.txt) do (
    findstr /bc:"%%a_%%b" car.txt >nul && (echo car) || (
      findstr /bc:"%%a_%%b" boat.txt >nul && (echo boat) || echo neither
    )
  )
)

如果ID的格式(可能是长度)可能有所不同,但日期部分的格式(长度)是常数,则可以使用子字符串:

代码语言:javascript
复制
@echo off
setlocal enableDelayedExpansion
>SendType.txt (
  for /f "delims=" %%a in (files.txt) do (
    set "ln=%%a"
    findstr /bc:"!ln:~0,-23!" car.txt >nul && (echo car) || (
      findstr /bc:"!ln:~0,-23!" boat.txt >nul && (echo boat) || echo neither
    )
  )
)

如果ID和日期格式都不是常量,那么我将通过去掉日期部分来更改boat.txt和car.txt的内容。然后可以使用FINDSTR /G选项。因为有一个/I,所以需要bug in FINDSTR选项。

代码语言:javascript
复制
car.txt
11111_2222-22
11112_2222-11

代码语言:javascript
复制
boat.txt
11122_1111-22
11144_3333-11

代码语言:javascript
复制
@echo off
setlocal enableDelayedExpansion
>SendType.txt (
  for /f "delims=" %%a in (files.txt) do (
    echo %%a|findstr /blig:car.txt >nul && (echo car) || (
      echo %%a|findstr /blig:boat.txt >nul && (echo boat) || echo neither
    )
  )
)

最新答案

现在我已经理解了需求,这应该可以解决问题了。我在最初的答案中基本上使用了第一段代码的一个变体,并且我已经切换到使用正则表达式。可以用[0-9]代替正则表达式中的每个.来进行更严格的测试。

代码语言:javascript
复制
@echo off
>SendType.txt (
  for /f "tokens=1,2,4 delims=_" %%a in (files.txt) do (
    findstr /brc:"%%a_%%b_....-..-.._%%c" car.txt >nul && (echo car) || (
      findstr /brc:"%%a_%%b_....-..-.._%%c" boat.txt >nul && (echo boat) || echo neither
    )
  )
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12901675

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档