找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 18877|回复: 5

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

[复制链接]
发表于 2013-2-2 22:03:40 | 显示全部楼层 |阅读模式
本帖最后由 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. (?~/]~#_#'-#\?![<?<.$][  @:?\?
复制代码
发表于 2013-2-2 22:25:17 | 显示全部楼层
本帖最后由 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
复制代码

评分

参与人数 1PB +25 收起 理由
batman + 25 我就没想到这个分别endlocal的方法

查看全部评分

发表于 2013-2-3 13:38:04 | 显示全部楼层
本帖最后由 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
复制代码
发表于 2013-2-4 12:31:43 | 显示全部楼层
  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
复制代码
发表于 2013-2-5 13:21:22 | 显示全部楼层
真是妙啊,用findstr /n 解决了输出空行的问题,利用零不能为除数判断输出完成。只是小弟有一处不解,为什么要分别endlocal,恳请版主解惑。先谢过啦!
发表于 2013-2-5 15:15:34 | 显示全部楼层
  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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-16 22:21 , Processed in 0.014649 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表