![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-02 02:27 |
共 48,037 主题排行 / 350,122 发帖 / 今日 2 篇 / 48,250 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 请教搜索提取特定位置的字符难题 |
| 可打印版本 2,648 / 19 |
| 第1楼 cain | 发表于 2006-08-27 15:54 |
| 中级用户 发帖 72 积分 201 | |
|
请教搜索提取特定位置的字符难题 在NT CMD下,要提取一TXT文件中第N行(如第5行)中的从40列开始的6个字符并使之成为一变量。要求不要用第三方软件,请达者告知。
|
|
| 第2楼 electronixtar | 发表于 2006-08-27 16:06 |
| 铂金会员 发帖 2,672 积分 7,493 | |
As far as I know, try this command: This can print the 40th line to screen, and use Cmd variables to cut string from the the 6th, use 'for' to set the string as a final variable. |
|
| 第3楼 cain | 发表于 2006-08-27 16:34 |
| 中级用户 发帖 72 积分 201 | |
Originally posted by electronixtar at 2006-8-27 16:06: 谢谢你。不过你这个不对的,据more /?了解,“+n 从第 n 行开始显示第一个文件” |
|
| 第4楼 NaturalJ0 | 发表于 2006-08-27 17:38 |
| 银牌会员 发帖 533 积分 1,181 | |
|
for 有个 skip 参数,可以试下。
|
|
| 第5楼 3742668 | 发表于 2006-08-27 19:12 |
| 荣誉版主 发帖 718 积分 2,013 | |
|
关于获得文件指定行的内容,个人认为最简单莫过于使用findstr了:
拷贝上面的代码,粘贴到你的脚本末尾,如果标号dosomething前面非空白最后一行内容不是goto :eof则自行加上。 可以在你的批处理中使用 call :dosomething 参数1 参数2 参数3来调用。 注: 参数1:要查看的文件完整路径以及文件名 参数2:行号 参数3:字符的位置 |
|
| 第6楼 zh159 | 发表于 2006-08-28 03:06 |
| 金牌会员 发帖 1,467 积分 3,687 | |
|
楼上的有点错误:
设%3=10,“echo !str:~10,1!”显示的字符不是第“10”个字符,而是“10+1”个字符,因为第一位字符是“echo !str:~0,1!”,所以要把“%3”转换一下:“%3-1” 用“findstr /n . %1 ^| findstr "^%2"”方式要先给所有行加上行号再搜索设定的行数 改写了一个: :dosomething (显示空格一行可以不要) 用“set/a N=!N!+1”计数,当达到“if "!N!"=="%2"”时“set "str=%%i"&goto str” 这样不用搜索全部的行 |
|
| 第7楼 cain | 发表于 2006-08-28 08:46 |
| 中级用户 发帖 72 积分 201 | |
|
经测试,5楼版主的代码不能正确获取;6楼代码同样出错,代码中没有使用到findstr。
|
|
| 第8楼 NaturalJ0 | 发表于 2006-08-28 09:44 |
| 银牌会员 发帖 533 积分 1,181 | |
|
for /f "skip=4 tokens=*" %%i in (file.txt) do (
set str=%%i goto OUTFOR) :OUTFOR set str=%str:~39,6% [ Last edited by NaturalJ0 on 2006-8-28 at 09:54 ] |
|
| 第9楼 cain | 发表于 2006-08-28 11:55 |
| 中级用户 发帖 72 积分 201 | |
Originally posted by NaturalJ0 at 2006-8-28 09:44: |
|
| 第10楼 NaturalJ0 | 发表于 2006-08-28 13:10 |
| 银牌会员 发帖 533 积分 1,181 | |
|
setlocal EnableDelayedExpansion
for /f "tokens=*" %%i in (file.txt) do ( set str=%%i set str=!str:~39,6! >>newfile.txt echo !str!) endlocal newfile.txt 中是你要的内容,每行对应原来每行中第40列起的6个字符。 [ Last edited by NaturalJ0 on 2006-8-28 at 13:14 ] |
|
| 第11楼 cain | 发表于 2006-08-28 15:12 |
| 中级用户 发帖 72 积分 201 | |
|
NaturalJ0实在高。现仍有二个问题:
一是在8楼代码中,我想同时实现查找第30列开始的3个字符,改成如下,但不成功: for /f "skip=4 tokens=*" %%i in (file.txt) do ( set str=%%i goto OUTFOR) :OUTFOR set str=%str:~39,6% set str2=%str:~29,3% 二是在10代码中,我想实现的是查找该文本文件中所有行的第40列开始的6个字符并把每行中的结果独立成一个变量,不知能否? |
|
| 第12楼 NaturalJ0 | 发表于 2006-08-28 15:41 |
| 银牌会员 发帖 533 积分 1,181 | |
|
高什么高,偶也才来这里混了几天,大多是现学现用。上面几行代码还是前几天跟别人学的呢。
for /f "skip=4 tokens=*" %%i in (file.txt) do ( set str=%%i goto OUTFOR) :OUTFOR set str1=%str:~39,6% set str2=%str:~29,3% 如果全要设成变量这样试试看 setlocal EnableDelayedExpansion set/a num=0 for /f "tokens=*" %%i in (file.txt) do ( set str=%%i set str=!str:~39,6! set/a num=!num!+1 set str!num!=!str!) set str //这条语句是为了显示下运行结果,看看变量是否符合要求 endlocal //这些变量是临时的,只能在 endlocal 前使用,endlocal 语句执行后就自动消亡了。 [ Last edited by NaturalJ0 on 2006-8-28 at 15:45 ] |
|
| 第13楼 cain | 发表于 2006-08-28 16:18 |
| 中级用户 发帖 72 积分 201 | |
|
for /f "skip=4 tokens=*" %%i in (file.txt) do (
set str=%%i goto OUTFOR) :OUTFOR set str1=%str:~39,6% set str2=%str:~29,3% 这样还是不行的,我也觉得奇怪,str2就是没有任何内容。 |
|
| 第14楼 NaturalJ0 | 发表于 2006-08-28 17:32 |
| 银牌会员 发帖 533 积分 1,181 | |
|
我试有内容啊
|
|
| 第15楼 cain | 发表于 2006-08-28 17:36 |
| 中级用户 发帖 72 积分 201 | |
Originally posted by NaturalJ0 at 2006-8-28 17:32: 不好意思,是我搞错了。不过下面这个的确通不过: setlocal EnableDelayedExpansion set/a num=0 for /f "tokens=*" %%i in (file.txt) do ( set str=%%i set str=!str:~39,6! set/a num=!num!+1 set str!num!=!str!) set str //这条语句是为了显示下运行结果,看看变量是否符合要求 endlocal //这些变量是临时的,只能在 endlocal 前使用,endlocal 语句执行后就自动消亡了。 |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |