使用带有正则表达式的findstr来搜索字符串的各个部分

时间:2012-10-15 18:22:44

标签: string batch-file expression findstr

我创建的代码循环遍历files.txt的每一行,并确定文件是carboat还是neither,并将此信息存储到{{1} }。这是通过使用SendType.txt命令并搜索findstrboat.txt列表来完成的。从本质上讲,代码的设计方式是car.txt的第一行,看看它是否可以在files.txt中找到字符串(如果是car.txt则输出到car )如果不是,它将在SendType.txt中搜索字符串(如果在boat.txt中找到字符串,boat.txt输出到boat),并且如果找不到该字符串在car.txt或SendType.txt中,文字boat.txt输出到neither

现在代码搜索整个字符串行。每个字符串类似于SendType.txt11111_2222-22_2010-09-09_10-24-20.zip = ID,11111 =模型,2222-22 =日期,2010-09-09 =交易ID)。

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

10-24-20

@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
)
)

car.txt
11111_2222-22_2010-09-09_10-24-20.zip
11112_2222-11_2011-11-09_10-24-25.zip

boat.txt
11122_1111-22_2012-04-09_11-29-56.zip
11144_3333-11_2011-12-22_06-29-66.zip

期望的输出:

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

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

SendType.txt
boat
boat
neither
car
car
neither

1 个答案:

答案 0 :(得分:2)

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

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

@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的格式(可能长度)可能不同,但日期部分的格式(长度)不变,那么您可以使用子字符串:

@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选项。由于bug in FINDSTR

,因此需要/I选项
car.txt
11111_2222-22
11112_2222-11

boat.txt
11122_1111-22
11144_3333-11

@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]代替正则表达式中的每个.,可以使测试更加严格。

@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
    )
  )
)