Board logo

标题: [文本处理] [已解决]批处理findstr /o为何无法正常显示第一行偏移量? [打印本页]

作者: lfoqtal    时间: 2011-8-8 19:59     标题: [已解决]批处理findstr /o为何无法正常显示第一行偏移量?

本帖最后由 lfoqtal 于 2011-8-9 08:27 编辑
/O        在每个匹配行前打印字符偏移量。

这句话是findstr的说明
但在实际运行中,我发现它无法正常显示文本的第一行
  1. @echo off
  2. echo 123456|findstr /o "."
  3. echo 123456>1.txt
  4. echo asdafw>>1.txt
  5. echo 45688>>1.txt
  6. findstr /o "." 1.txt
  7. pause
复制代码
可以看到在显示单个变量时,根本无法计算出偏移量,显示0:
而在显示文本时第一行也是为0:,后几行则可以正常显示只是多算了两个数是换行符所占偏移量
为什么会这样呢,
尝试了多次后发现原来是累计偏移量问题啊!
第一行显示的是起头初始值,所以是0
他并不会在最后一行显示所累计的最终值,所以显示文本时少了最后一行的值

所以/o并不是用来计算总字符偏移量的,而是用来计算本行在总文本中是从第几位偏移开始的,所以只显示头不显示尾
作者: 601997526    时间: 2011-8-8 20:39

这个/o在我的理解中是计算本行之前的字符偏移量之和
而在第一行之前是没有字符的,所以才会显示为0
作者: lfoqtal    时间: 2011-8-8 21:10

计算单个变量长度的方法
  1. @echo off
  2. :1
  3. set /p p=
  4. for /f "delims=:" %%a in ('(echo.%p%^&echo.1^) ^|findstr /o "."') do set /a a=%%a-3
  5. echo %a%个字符
  6. pause>nul
  7. goto :1
复制代码
但在这里就不明白了.
为什么要-3而不是-2??
作者: wc726842270    时间: 2011-8-8 21:59

正如2L所说
FINDSTR /O 会计算包括它自身产生的字符,并在相应的行首显示出其总和
但不得不说这个参数没用过几回,也不知道对不对
作者: ArdentMan    时间: 2011-8-9 00:46

本帖最后由 ArdentMan 于 2011-8-9 00:47 编辑

每一行除了可见字符还有一个回车符和一个换行符

所以计算时要减去它们的偏移量2

因此计算本行的字节数要用下一行的偏移量减本行的偏移量并减2

计算末行的要先人为加上一行才行~~~~
作者: hanyeguxing    时间: 2011-8-9 01:39

本帖最后由 hanyeguxing 于 2011-8-9 01:41 编辑

回复 3# lfoqtal

计算单个变量长度的方法
  1. @echo off
  2. :1
  3. set /p p=
  4. for /f "delims=:" %%a in ('(echo.%p%^&echo.1^) ^|findstr /o "."') do set /a a=%%a-3
  5. echo %a%个字符
  6. pause>nul
  7. goto :1
复制代码
复制代码但在这里就不明白了.
为什么要-3而不是-2??
lfoqtal 发表于 2011-8-8 21:10

1,/o 统计的是此行之前的偏移和
2,换行、回车也在统计内
3,因为 (echo.%p%&echo.1) | 命令 使得字符串后多了一个空格,所以该减3
作者: lfoqtal    时间: 2011-8-9 08:26

回复 6# hanyeguxing


    原来如此,我都忘了|管道会在句尾加个空格这件事了




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2