![Board logo](images/default/logo.gif)
标题: [文本处理] [已解决]批处理怎么以两个字为一组输出字符? [打印本页]
作者: er8852973 时间: 2011-4-8 21:03 标题: [已解决]批处理怎么以两个字为一组输出字符?
本帖最后由 er8852973 于 2011-4-11 07:23 编辑
- @echo off
- setlocal EnableDelayedExpansion
- for /f "delims=" %%i in (hh.txt) do (
- set a=%%i
- for %%i in (if "!a!" !="") do (
- set b=!a:~0,2!
- echo !b!
- set a=!a:~2!
- )
- pause>nul
- )
- pause
复制代码
hh.txt内容为
我是初学者请大家多关照
我是菜鸟请大家多指教
我的输出的结果是
我是
初学
者请
大家
多关
照哦
是菜
鸟请
大家
就是两个字这样输出 但我的代码只能完成每行的前六个字符的输出 不知为何
作者: hanyeguxing 时间: 2011-4-8 21:16
本帖最后由 hanyeguxing 于 2011-4-8 22:34 编辑
- @echo off&setlocal EnableDelayedExpansion
- for /f "delims=" %%a in (hh.txt) do (
- set "a=%%a"
- for /l %%b in (0,2,8192) do if not "!a:~%%b,2!"=="" echo;!a:~%%b,2!
- pause>nul
- )
- pause&exit
复制代码
- @echo off
- for /f "delims=" %%a in (hh.txt) do (
- set "a=%%a"
- call:a
- pause>nul
- )
- pause&exit
- :a
- echo;%a:~0,2%
- 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
- 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个代码:- @echo off
- for /f "delims=" %%a in (hh.txt) do (
- set "a=%%a"
- call:a
- pause>nul
- )
- pause&exit
- :a
- echo;%a:~0,2%
- 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
我相信有一天,总有一天好的文章是由中文写的(这个说实话,很不现实,思维方式就是一个问题。不过还是想像一下童话吧)![](images/smilies/grapeman/15.gif)
作者: hfg1977 时间: 2011-4-11 18:59
- 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区时才包括换行符号.
多行可以如下:- type 01.txt|sed ":a;N;s/\n//;ba"|sed "s/\(....\)/\1\n/g"
复制代码
:a ---定义标签"a"
ba ----返回到标签"a"
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |