批量查找字符串并复制下几个字符

时间:2015-12-13 06:43:58

标签: batch-file

基本上我有132个文本文件。每个文本文件都包含字符串:

  

˚F的 X .item.r =阿拉伯语%20coran.zoom.zoom""选择":[{"名称":&# 34;变焦""数据" {" _width":

X 表示文本文件的名称(1到132之间的数字)。

文件中名为" 3"的文本的一部分;看起来如下:

  

Bservices / AJAX /模式/ SINGLE /柜:/12148/btv1b10510341k/f3.item.r=arabe%20coran.zoom.zoom","选择":[{"名称":"变焦""数据" {" _width":3652," _height":2729," _id":"柜:/ 12148 / btv1b10510341k / F3"" _context":库/ IIIF /图像 -

并且整个文本在一行中。

我想要实现的是获取所有文件后width":(文件3中为3652)和height":后面的数字(文件3中为2729)之后的数字,以下列格式打印到名为OutputXY.txt的文本文件中:

1 (TAB) 4724 (TAB) 7392
2 (TAB) 8126 (TAB) 3021
3 (TAB) 3652 (TAB) 2729

这是我到现在为止所能想到的

@echo off

SET File=1
SET Search="meow"

:LOOP
SET Search=f%File%.item.r=arabe%%20coran.zoom.zoom""","""options""":[{"""name""":"""zoom""","""data""":{"""_width""":

findstr %Search% %File%.txt) >> OutputXY.txt REM(I want this function to somehow print the width and the height to OutputXY.txt)

SET /A File=File+1
If "%File%" LEQ "132"(
GOTO LOOP
) else (
pause
exit
)

此外,我无法直接搜索width":height':,因为文件中还有其他宽度和高度。我必须搜索该特定代码。

我是各种节目中的完整菜鸟。我现在不知道该怎么做了.-。

非常感谢

2 个答案:

答案 0 :(得分:1)

@echo off
setlocal enabledelayedexpansion
break>output.txt
for /f "delims=" %%a in ('findstr /R "\/f[0-9].*\.item\." *.txt') do (
  set line=%%a
  set _file=!line:*/f=!
  set _width=!line:*"_width":=!
  set _height=!line:*"_height":=!
  for /f "delims=.," %%b in ('set _') do set %%b
 >>output.txt echo !_file!  !_width!    !_height!
)
type output.txt

我对单纯/f(对于文件)的搜索字符串不满意。我不是很短,因此可能不够独特。虽然它似乎与你给出的例子很好地合作。

答案 1 :(得分:0)

非常很难在纯批处理脚本中指定如此复杂的搜索字符串,因为有许多字符具有特殊含义,例如" % {{1}例如,,

假设满足下面提到的假设,以下代码应该适合您:

=

假设:

  • 模式@echo off setlocal EnableExtensions > "OutputXY.txt" ( for /F "delims=" %%F in ('dir /B "*.txt" ^| findstr /R "^[0-9][0-9]*\.txt$"') do ( for /F "delims=" %%L in ('findstr /L "\/f%%~nF\.item\.r" "%%~F"') do ( setlocal DisableDelayedExpansion set "LINE=%%L" setlocal EnableDelayedExpansion set "LINE=!LINE:*/f%%~nF.item.r=!" set "WIDTH=!LINE:*"_width":=!" set "HEIGHT=!LINE:*"_height":=!" for /F "tokens=1,2 delims=," %%M in ('echo WIDTH^,!WIDTH! ^& echo HEIGHT^,!HEIGHT!') do ( set "%%M=%%N" ) echo %%~nF !WIDTH! !HEIGHT! endlocal endlocal ) ) ) endlocal /f X在每个文件中都是唯一的,当 .item.r 也是文件时名;
  • 感兴趣的关键字X"_width":"_height": /f X模式之后的第一个;
  • 感兴趣的关键字.item.r"_width":与前一个"_height": /f X模式位于同一行;
  • 宽度和高度数后面的分隔符是.item.r;
  • 包含所有感兴趣信息的文件行不超过8190个字符的长度;

说明:

  • 外部,循环遍历所有for /F %%F个文件,这些文件仅在其名称中包含数字;这是由*.txt完成的,由dir /B过滤,因为findstr不支持正则表达式; finally dir解析for /F;
  • 的输出
  • 内部findstr循环解析for /F %%L的输出,该输出搜索文本文件中包含模式findstr /f {的行{1}}; X .item.r表示,其中X修饰符从外部%%~nF循环中提取纯(数字)文件名;
  • 在嵌套~n循环的主体中,完成了几个字符串替换活动:
    • 首先,删除所有包含模式for /F %%F for /F /f的内容;
    • 接下来,除X.item.r的第一次出现之外的所有内容都会被移除并分别存储到单独的变量"_width":"_height":中;
    • 最后,使用另一个WIDTH循环删除了HEIGHT,中存储的值中的第一个WIDTH以及之后的所有内容;
    • delayed expansion已切换,以避免使用特殊字符时遇到任何问题,例如HEIGHT for /F %%M % ! ^ {{1} } &;
  • 最外面的块仅用于将输出数据重定向一次(<),而不是多次重定向(在>后面附加|循环;