`

批处教程 for /f 中的Delims和Tokens总结

 
阅读更多

来源:http://blog.sina.com.cn/s/blog_4b795cc10100ez8d.html

 

For命令语句的参数F中,最难理解的就是Delims和Tokens两个选项,本文简单的做一个比较和总结。
For /f”常用来解析文本,读取字符串。分工上,delims负责切分字符串,而tokens负责提取字符串。如果把字符串当作蛋糕,Delims像刀子,用来切蛋糕,tokens像叉子,用来取切好的蛋糕。下面我们用实例来进行理解。

    把以下内容保存为文本文件“歌曲列表.txt”,注意扩展名为“.txt”:
序号、歌手名-歌曲名.后缀名
1、饶天亮-玫瑰爱人.wma
2、高一首-我不愿错过.mp3
3、黃凱芹-傷感的戀人.MP3
4、黄灿-黄玫瑰.lrc
5、黎姿-如此这般的爱情故事.mp3

代码1:显示全部内容
@echo off
for /f %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号、歌手名-歌曲名.后缀名
1、饶天亮-玫瑰爱人.wma
2、高一首-我不愿错过.mp3
3、黃凱芹-傷感的戀人.MP3
4、黄灿-黄玫瑰.lrc
5、黎姿-如此这般的爱情故事.mp3

讲解:
    如果不使用参数“/f”,运行结果只显示括号里的文字字符“歌曲列表.txt”,而不能读取文本文件“歌曲列表.txt”中的内容。可见,“/f”是解析文本字符串的好工具。

一、delims
    假如只要序号,不要歌手名、歌曲名和后缀名,如何办到?
代码2:默认提取第一列
@echo off
for /f "delims=、" %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号
1
2
3
4
5

讲解:
    "delims=、"表示定义顿号“、”为分隔符,并用该分隔符“、”切分文本字符串。字符串就是“歌曲列表.txt”里的内容,也就是文件里的文字和标点符号。
该顿号是原文中就有的。除了顿号“、”,原文中还有减号“-”和点号“.”,因此你也可以用它们来做分隔符。

代码3:用减号“-”做分隔符
@echo off
for /f "delims=-" %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号、歌手名
1、饶天亮
2、高一首
3、黃凱芹
4、黄灿
5、黎姿

讲解:
    因为,当减号“-”被用做分隔符时,每行内容被减号“-”分隔成前后两半,默认只显示前半部分,而后半部分连同分隔符减号“-”都被忽略(省略)了。

代码4:用点号“.”做分隔符
@echo off
for /f "delims=." %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号、歌手名-歌曲名
1、饶天亮-玫瑰爱人
2、高一首-我不愿错过
3、黃凱芹-傷感的戀人
4、黄灿-黄玫瑰
5、黎姿-如此这般的爱情故事

讲解:
    默认情况下,单纯使用delims而不用tokens时,只显示第一个分隔符前的内容,第一个分隔符和第一个分隔符后面的内容将被忽略。

代码5:定义多个分隔符
@echo off
for /f "delims=、-." %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果:
序号
1
2
3
4
5

讲解:
    原因是,当定义顿号“、”、减号“-”和点号“.”三个标点符号为分隔符后,原文被分隔成四个部分。
    如第二行“1、饶天亮-玫瑰爱人.wma”将被分隔成“1”、“饶天亮”、“玫瑰爱人”和“wma” 四个部分。
    从第一行到最后一行,每行的每个部分对应下来相当于一个竖列。因此,原文就有“序号”、“歌手名”、“歌曲名”、“后缀名”四列。
    一般情况下,只读取第一列的内容。后面的内容需要用tokens选项提取。

 

二、tokens
    假如只要歌手名和歌曲名,不要序号和后缀名,如何办到?
代码6:提取单列
@echo off
for /f "tokens=2 delims=、." %%i in (歌曲列表.txt) do echo %%i
pause>nul
运行结果将显示:
歌手名-歌曲名
饶天亮-玫瑰爱人
高一首-我不愿错过
黃凱芹-傷感的戀人
黄灿-黄玫瑰
黎姿-如此这般的爱情故事

讲解:
用delims定义顿号“、”和点号“.”作为分隔符,将原文分成三部分。
如第六行“5、黎姿-如此这般的爱情故事.mp3”被分割成:
第一部分(第一列):5
第二部分(第二列):黎姿-如此这般的爱情故事
第三部分(第三列):mp3
“tokens=2”表示用tokens提取第二列的字符串,即“黎姿-如此这般的爱情故事”。
没有被tokens定义提取的第一列和第三列将被忽略。

假如只要序号和歌曲名,而不要歌手名和后缀名,如何办到?
代码7:提取多列
@echo off
for /f "tokens=1,3 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j
pause>nul
运行结果将显示:
序号歌曲名
1  玫瑰爱人
2  我不愿错过
3  傷感的戀人
4  黄玫瑰
5  如此这般的爱情故事

讲解:
“delims=、-.”表示定义顿号、减号和点号为分隔符。
“tokens=1,3”表示只提取第一列和第三列。
“%%i %%j”对应于“token”后面的列数。有多少列就要有多少个输出变量,并且各变量中的字母存在先后顺序。


如何只提取文字,不要标点符号?
代码8:忽略分隔符
@echo off
for /f "tokens=1,2-4 delims=、-." %%i in (歌曲列表.txt) do echo %%i %%j %%k %%l
pause>nul
运行结果:
序号 歌手名 歌曲名后缀名
1  饶天亮玫瑰爱人 wma
2  高一首我不愿错过 mp3
3  黃凱芹傷感的戀人 MP3
4  黄灿黄玫瑰 lrc
5  黎姿如此这般的爱情故事 mp3

讲解:
默认情况下,用做分隔符的标点符号将被忽略。
“tokens=1,2-4”中的“2-4”表示第二至第四列。

三、小结

For /f”
一句话总结:解析文本,读取字符串。

Delims的语法:
FOR /F "Delims=符号集"  %%I

IN (Command1) DO
Command2
一句话总结:忽略分隔符,切分字符串。

delims的意义包括两个方面:
第一、指定原文中的标点符号作为分隔符。使得文本被划分为许多小部分,方便使用批处理命令读取和编辑。
第二、读取第一个分隔符之前的内容。忽略第一个分隔符和分隔符后面的内容,如需读取和编辑,需要使用tokens等命令。

    注意分隔符和标点符号的联系和区别。
    分隔符就是原文中的标点符号,可以是一个标点符号也可以是多个。但原文中的标点符号不一定是分隔符。
    分隔符需要定义,即用”delims=”来指定,等于号后面跟被用来做分隔符的标点符号,该标点符号来自原文。
    当有多个标点符号被定义为分隔符时,标点符号之间没有空格。当用空格做分隔符时,空格应该放在其它用作分隔符的标点符号之后。
    即使不使用delims,默认情况下,批处理也将空格作为分隔符。如文件名“Program Files”中含有空格时,批处理一般只读取空格前的“Program”,剩下的“Files”被忽略了。
例:
代码9:空格默认作为分隔符
@echo off
for /f "delims=" %%a in ("伟大的中国人民万岁 万岁 万万岁") do echo %%a
pause>nul
运行结果:
伟大的中国人民万岁 万岁万万岁
讲解:
    “delims=”代表取消默认以空格作为分隔符。
    批处理默认空格是分隔符,分隔符会隐藏第一个分隔符后面的所有内容。为了显示完整的信息,所以有必要取消该功能。
    因此,当文件名或路径中含有空格时,需要用双引号括住。如果不使用双引号,括号内的内容将被当做文件名,如果文件名不存在,将提示“系统找不到……”。
如果不使用“delims=”,即使使用双引号,也只能显示第一个空格前面的字符串,后面的字符串将被默认忽略。


Tokens的语法:
FOR /F "tokens=x,y,m-n"  %%I   IN (Command1) DO Command2
一句话总结:提取列。

Tokens的意义就是,提取指定的列。
    注意列与句的联系与区别。
    文本内容由许多文字字符串组成,它们被标点符号分隔,两个标点符号之间的语句我们称为“句子”。
    当标点符号被“tokens=”指定为分隔符之后,文字将被分成多个部分。对应的每行的每个部分我们称之为“列”。
    一列可能是一个句子,也可能包含多个句子,视delims定义的标点符号而定。

    其它方面:关于“行”的提取,前面做过一个很简单的:
@echo off
findstr /n .* 12.txt>>122.txt
set /p m=请输入要定位的行:
findstr   /b "%m%" 122.txt
pause

 

分享到:
评论

相关推荐

    批处理之 for _f 中的delims和tokens_tokens.pdf

    批处理之 for _f 中的delims和tokens_tokens.pdf

    查到里某个IP的计算机名.bat

    for /f "tokens=3 skip=2 delims=: " %%i in ('nbtstat -n') do ( set "IP=%%i" set IP=!IP:~1,-1! ECHO 本机IP为:!IP! goto :next ) :next for /f "delims=. tokens=1,2,3,4" %%i in ("%IP%") do set range=%%i.%%...

    IPC$利用工具批处理

    for /f "eol=P tokens=1 delims= " %%i in (1.txt) do echo %%i>>2.txt del 1.txt /q for /f "eol=S tokens=1 delims= " %%i in (2.txt) do echo %%i>>1433.txt del 2.txt /q if not exist 1433.txt echo no ip。&& ...

    简历关键数据提取器

    for /f "tokens=1,2 delims= " %%i in ('dir/b 51*.txt') do ( set t=%%i echo t=!t! call echo %%t%% echo t2=!t! for /f "tokens=1-4 delims=_." %%i in ("!t!") do ( echo %%j echo %%k set...

    vista 上網補丁

    @for /f "usebackq tokens=7 delims=\" %%a in (`reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\NetworkCards"`) do ( set reg_path_id=%%a set "reg_path=HKEY_LOCAL_MACHINE\...

    Windows原生内存清理工具empty.exe及其使用

    附件中的empty.exe是Windows2003下的一个内存清理工具,经测试可以用在Win7 64位下 在批处理中,可以使用如下调用方式: ...for /f "delims=, tokens=2" %%a in ('tasklist /fo csv /nh') do empty %%~a

    文件转移代码

    for /f "tokens=* delims=" %%j in ('dir /a-d /s /b %%i:\*.mp3') do ( move /y "%%j" "f:\all" ) ) ) @echo off :1 move /y "F:\all\Beyond*.mp3" D:\123 move /y "F:\all\周传雄*.mp3" D:\456 echo wscript....

    ISOcreat ISO的制作工具

    for /F "tokens=1-4 delims=:., " %%a in ('time/T') do set TIME=%%a%%b%%c for /F "tokens=1-4 delims=/- " %%A in ('date/T') do set DATE=%%B%%C%%D if exist U3CUSTOM.ISO ren U3CUSTOM.ISO U3CUSTOM.ISO.%...

    Win2003下通过IP安全策略限制udp-flood发包的批处理代码

    代码如下::Created by //www.jb51.net:DROP UDP Flood@echo offcls:获取DNS地址for /f “delims=: tokens=1,2” %%a in (‘ipconfig /all ^|findstr /i “DNS Server”‘) do (set DNSIP=%%b):新建IP安装策略禁止...

    静态IP网关双重绑定

    for /f "skip=2 delims=: tokens=2" %%i in (phyaddr.txt) do set phyaddr=%%i&echo 本地物理地址为%%i find " IP Address" ipconfig.txt >ipaddr.txt for /f "skip=2 delims=: tokens=2" %%i in (ipaddr.txt) do ...

    域控:批量增加域控用户

    for /f "skip=1 eol=; tokens=1-10 delims=," %a in (c:\addusers.csv) do dsadd user cn=%a,ou=xxoo,dc=xx,dc=com -upn %b@gf.com -samid %b -pwd %c -ln %b -display %b -desc %d -mustchpwd yes -disabled no ...

    Android apk批量校验验证渠道、版本号

    功能:可校验单个或目录下所有apk文件的渠道号、版本号 使用说明: ... (for /f "usebackq tokens=1,2 delims=_" %%i in ('!fileName!') do set nameChannel=%%j) 如有疑问请咨询QQ群:309028162

    查询局域网IP

    查询局域网IP.bat文件 COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑...for /f "tokens=3 skip=2 delims=: " %%i in ('nbtstat -n') do ( set "IP=%%i" set IP=!IP:~1,-1! ECHO 本机IP为:!IP! goto :next )

    Dos命令大全

    @for /f "tokens=1,2,3 delims= " %%i in (victim.txt) do start call door.bat %%i %%j %%k tokens的用法请参见上面的sample1,在这里它表示按顺序将victim.txt中的内容传递给door.bat中的参数%i %j %k。 而...

    防止第二个指定相同进程出现的批处理(bat)实例

    for /f "tokens=* DELIMS=" %%z in ('type %0') do (set zzz=%%z) set m=%zzz:~-5,-4% set mm=%zzz:~-20,-19% set mmm=%zzz:~17,1% set mmmm=%zzz:~3,1% set mmmmm=%zzz:~-20,-19% set mmmmmm=%zzz:~-21,-20% echo %...

    根据本机的ip地址切换网关批处理

    for /f "skip=2 tokens=16 delims=." %%I in (IP.txt) do set ip=%%I :::::::::绑定本机IP地址和MAC地址 set/a num=%ip%%%2 if %num%==1(echo 奇数 route CHANGE 0.0.0.0 MASK 0.0.0.0 192.168.1.33 ) if %...

    HandleV4.0.rar

    for /f "tokens=2,3 skip=5 delims=:" %%a in ('handle.exe -p devenv.exe "%1.pdb"') do ( for /f "tokens=1,4" %%c in ("%%a %%b") do ( handle -p %%c -c %%d -y >a.txt ) ) exit /b 0 @第一个for循环的...

    如何编写批处理文件批处理文件批处理文件

    简明批处理教程22009年10月20日 星期二 下午 05:35 最近对于批处理技术的探讨比较热,也有不少好的批处理程序发布,但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件,也就更谈不上自己动手编写了,古...

    输出CMD命令帮助到文本

    for /f "tokens=1* delims=," %%i in (%1) do ( %%i /?>>XPCMD命令.txt >>XPCMD命令.txt echo =========================================== >>XPCMD命令.txt echo =========================================== ...

    bat和python批量重命名文件的实现代码

    最近从某网站下载了一批文档,但是文件是用数字串命名的文档(很多图书馆都这样吧),现在我也下载完了这些文件,也有这些文件的列表,就是不能... for /f “tokens=1,2 delims= ” %%b in (1.txt) do ( if “%%~nxa”

Global site tag (gtag.js) - Google Analytics