[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

【练习-072】批处理按要求原样输出特殊字符文本内容

本帖最后由 batman 于 2013-2-2 22:19 编辑

出题目的:
    1、重温特殊字符输出处理方法;
    2、重温空行输出处理方法;
    3、学习局部变量传递方法。
加分原则:
    满分30分,视代码和思路酌情加分,以思路为重。
题目如下:
    有特殊字符文本a.txt,要求输出a.txt第8个含有&字符行前面所有行的内容,当然也包括空行。
在这里请注意这个8并不是指的文本的自然行,而是每当行中含有&字符计数加1,当计数达到8时
前面所有的行(含本行),之后的行就不要输出了(本题应输出并只输出到第19行)。总之,题目
说难不难,说易不易,大家都来晒晒自己的思路和技巧吧。
a.txt
  1. }_){*|%<:\!`~"_.} =!>[."~|#+|
  2. -|*#_[{\ ["",*@ >'+{+,\{[[:-`]
  3. ;&'^;`|[^  @,{=?@;.}[-.:,.!|<#
  4. :@"->\;#,%}%* (}"')('&-]=.`|{(
  5. `>?||>[.'!_$`\#<+) <~<#>_&~\$`
  6. !-~:@)/@][|>\~:}^/}.^!)=>-\,{^
  7. $$*$*$^,]~".&#?_#;'(?)^>@\].{^
  8. -~^/<_$}_/$.}_-(=]/})+%-"-^\]>
  9. [<^._@|_?.";}[$'#]>");/-;!{#".
  10. :,'_(}`@~-\]`)-> ]-.(;\'^]++,+
  11. =+'/}]"`* #_ {[[;&{{)$|](,<]~/
  12. .;@/<-^[*#=+~&%/;"=${|}?`.`_#/
  13. =>>[@^]{.{<#>*`}]]([)/|]_#_/$/
  14. ),\<.-<?"<\.))\',`@&&\+'+?`>}&
  15. (%?<*{:\@/>;/=\`:|(}""~;`|[&?!
  16. !^.}'~:[{(][\<'"=-^+#.*"/$(:&&
  17. :^'`.{,"?@"~|(_`:(+<</({=+~-{|
  18. ]!,|("|@[<#&^?;&](^~}%{!^),>./
  19. !-~'- #}@(\>{#(,~*]=.`%_$@(`-*
  20. (?~/]~#_#'-#\?![<?<.$][  @:?\?
复制代码
***共同提高***

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in ('find /c /v ""^<a.txt') do (
  3. for /l %%b in (1 1 %%a) do (
  4. set str=&set /p str=
  5. if !n! lss 8 echo;!str!
  6. if defined str if !str:^&^=! neq !str! set /a n+=1
  7. )
  8. )<a.txt
  9. pause
复制代码
再来个恶心的:
  1. @echo off
  2. for /f "tokens=1,2 delims=:" %%a in ('findstr /n "&" a.txt^|findstr /n .') do (
  3. echo %%a|find "8">nul&&for /f %%a in ('find /c /v ""^<a.txt') do set /a n=%%a-%%b
  4. )
  5. set n|findstr "^n=">nul 2>&1&&sort /+128 a.txt|more +%n%|sort /+128
  6. pause
复制代码

TOP

真是妙啊,用findstr /n 解决了输出空行的问题,利用零不能为除数判断输出完成。只是小弟有一处不解,为什么要分别endlocal,恳请版主解惑。先谢过啦!

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set count=0
  4. (
  5.     for /f %%a in (' findstr /n .* a.txt ') do (
  6.         set str=
  7.         set /p str=
  8.         echo,!str!
  9.         
  10.         set str=#!str!
  11.         if "!str:&=!" neq "!str!" (
  12.             set /a "count += 1, 1 / (count - 8)" 2>nul || goto finish
  13.         )
  14.     )
  15. ) <a.txt
  16. :finish
  17. echo 完成
  18. pause
复制代码

TOP

本帖最后由 terse 于 2013-2-3 14:48 编辑

去掉FOR
搞来搞去 和版主一样 早知道不贴了
  1. @echo off
  2. set num=1
  3. for /f "delims=" %%i in (' findstr /n .* a.txt ') do (
  4.     set str=%%i
  5.     setlocal enabledelayedexpansion
  6.     if !num! leq 8 echo;!str:*:=!
  7.     if "!str:&=!" neq "!str!" (
  8.        endlocal&set /a num+=1
  9.     ) else endlocal
  10. )
  11. pause
复制代码

TOP

本帖最后由 tmplinshi 于 2013-2-2 22:54 编辑
  1. @echo off
  2. setlocal
  3. for /f "delims=" %%a in (' findstr /n .* a.txt ') do (
  4.     set str=%%a
  5.     setlocal enabledelayedexpansion
  6.     echo,!str:*:=!
  7.    
  8.     if "!str:&=!" neq "!str!" (
  9.         endlocal
  10.         set /a "count += 1, 1 / (count - 8)" 2>nul || goto finish
  11.     ) else (
  12.         endlocal
  13.     )
  14. )
  15. :finish
  16. echo 完成
  17. pause
复制代码
1

评分人数

    • batman: 我就没想到这个分别endlocal的方法PB + 25

TOP

返回列表