Board logo

标题: [文本处理] [已解决]批处理怎么以两个字为一组输出字符? [打印本页]

作者: er8852973    时间: 2011-4-8 21:03     标题: [已解决]批处理怎么以两个字为一组输出字符?

本帖最后由 er8852973 于 2011-4-11 07:23 编辑
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f "delims=" %%i in (hh.txt) do (
  4. set a=%%i
  5. for   %%i in (if "!a!" !="") do (
  6. set b=!a:~0,2!
  7. echo !b!
  8. set a=!a:~2!
  9. )
  10. pause>nul
  11. )
  12. pause
复制代码
hh.txt内容为
我是初学者请大家多关照
我是菜鸟请大家多指教


我的输出的结果是  
我是
初学
者请
大家
多关
照哦
是菜
鸟请
大家

就是两个字这样输出  但我的代码只能完成每行的前六个字符的输出 不知为何
作者: hanyeguxing    时间: 2011-4-8 21:16

本帖最后由 hanyeguxing 于 2011-4-8 22:34 编辑
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /f "delims=" %%a in (hh.txt) do (
  3.         set "a=%%a"
  4.         for /l %%b in (0,2,8192) do if not "!a:~%%b,2!"=="" echo;!a:~%%b,2!
  5.         pause>nul
  6. )
  7. pause&exit
复制代码
  1. @echo off
  2. for /f "delims=" %%a in (hh.txt) do (
  3.         set "a=%%a"
  4.         call:a
  5.         pause>nul
  6. )
  7. pause&exit
  8. :a
  9. echo;%a:~0,2%
  10. if not "%a:~2%"=="" set "a=%a:~2%"&goto:a
复制代码

作者: batman    时间: 2011-4-8 21:32

我想问一下楼主for   %%i in (if "!a!" !="")是什么意思,你原想它在代码中起到什么作用?

实际上它起到的作用就如同for %%i in (1 1 1),所以你后面的输出只会有三次也就是六个字符!
作者: hfg1977    时间: 2011-4-9 15:57

  1. sed "N;s/\n//;s/\(....\)/\1\n/g" 01.txt
复制代码

作者: er8852973    时间: 2011-4-9 18:40

那3L 我的代码中for   %%i in (if "!a!" !="")这一句是:只要一行字符没有结束 即没有换行,就继续for循环 既然我的代码不对 那我的这个目的应该怎样达到呢 你能给出具体的代码吗 我的意思是就这一行代码
作者: hanyeguxing    时间: 2011-4-9 19:52

5# er8852973


如果想用:
set b=!a:~0,2!
echo !b!
set a=!a:~2!

这样类似的,那么就需要跳回。但在for内是不能直接跳转循环的,必须使用call在for外做。
set b=!a:~0,2!
echo !b!
可以写成echo %a:~0,2%
跳回和重新定义变量使用:if not "%a:~2%"=="" set "a=%a:~2%"&goto:a
所以就有了2楼的第2个代码:
  1. @echo off
  2. for /f "delims=" %%a in (hh.txt) do (
  3.         set "a=%%a"
  4.         call:a
  5.         pause>nul
  6. )
  7. pause&exit
  8. :a
  9. echo;%a:~0,2%
  10. if not "%a:~2%"=="" set "a=%a:~2%"&goto:a
复制代码

作者: wc726842270    时间: 2011-4-9 23:49

4# hfg1977
能否作一下简单的解释,有的地方处理的,我不是太明白。呵呵。
作者: Batcher    时间: 2011-4-10 12:49

7# wc726842270


那个代码只是针对楼主给的例子中的情况:两行内容
你找个三行的文件它都处理不了

如果想看看它的执行过程,可以用sedsed
http://sedsed.sourceforge.net/
作者: wc726842270    时间: 2011-4-10 14:12

我相信有一天,总有一天好的文章是由中文写的(这个说实话,很不现实,思维方式就是一个问题。不过还是想像一下童话吧)
作者: hfg1977    时间: 2011-4-11 18:59

  1. sed "N;s/\n//;s/\(....\)/\1\n/g" 01.txt
复制代码
说明一下:
这个命令由2个子命令组成:
1,
N;s/\n//;   ---读入第二行,去掉所有的换行符号,即合并为一行;
N       -- 添加下一笔资料到 pattern space;
s/\n//  ---替换命令, \n表示换行符;
2.
s/\(....\)/\1\n/g   ----每4个英文字符后面加上换行符
\(..\) 标记匹配字符,如'\(love\)\(you\)',love被标记为1,you被标记为2。 用'\1\2'来引用
s/.../.../flag   ---替换命令
s 表示替换(substitute)文件内字符串.其指令格式如下 :
[address1[ ,address2]] s/pattern/replacemen/[flag]

pattern : 它为 reguler expression 字串。它表示文件中要被替换的字串。  
replacement : 它为一般字串。但其内出现下列字元有特别意义 :  
& : 代表其前 pattern 字串。例如
        sed -e 's/test/& my car/' 资料档名
        指令中 , & 代表 pattern 字串 "test"。故执行後 , 资料档的 "test" 被替换成 "test my car"。  
n : 代表 pattern 中被第 n 个(...)所括起来的字串。例如  
        sed -e  's/(test) (my) (car)/[2 3 1]/' 资料档名     
        指令中 , 1 表示 "test"、2 表示 "my"、1 表示 "car" 字串。故执行後 , 资料档的 "test my car" 被替换成 "[my car test]"。  
: 可用它来还原一些特殊符号(如上述的 & 与 )本身字面上的意义 , 或用它来代表换行。  

flag : 主要用它来控制一些替换情况 :
当 flag 为 g 时,代表替换所有符合(match)的字符串 .
当 flag 为十进制数 m 时,代表替换行内第 m 个符合的字符串.
当 flag 为 p 时,代表替换第一个符合 pattern 的字符串后,将数据输出标准输出文件.
当 flag 为 w file 时 , 代表替换第一个符合 pattern 的字符串后 , 输出到 file 檔内(如果 file 不存在 , 则会重新开启名为 file 的档案).
当没有 flag 时 , 则将本行内第一个(可能一行内有多个匹配)符合 pattern 的字符串以 replacement 字符串来替换
当没有 flag 时 , 则将资料行内第一个符合 pattern 的字串以 replacement 字串来替换 。


正像Batcher所说,你找个三行的文件它都处理不了.原因在于sed是行处理工具,它把每行内容读入pattern space进行处理,并不包括不可见的换行符号,只有把多行内容读入pattern space区时才包括换行符号.
多行可以如下:
  1. type  01.txt|sed ":a;N;s/\n//;ba"|sed "s/\(....\)/\1\n/g"
复制代码
:a  ---定义标签"a"
ba  ----返回到标签"a"




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