Summary of Delims and Tokens in batch tutorial for /f

Source: http://blog.sina.com.cn/s/blog_4b795cc10100ez8d.html

 

In the parameter F of the For command statement, the most difficult to understand is the two options of Delims and Tokens. This article simply makes a comparison and summary.
" F or /f" is often used to parse text and read strings. In terms of division of labor, delims are responsible for splitting strings, while tokens are responsible for extracting strings. If you think of strings as cakes, De lims are like knives for cutting cakes, and tokens are like forks for cutting cakes. Below we use examples to understand.

    Save the following content as a text file "song list.txt", note that the extension is ".txt":
serial number, singer name-song name. suffix
1 , Rao Tianliang-rose lover.wma
2 , high song-I don't Willing to Miss.mp3
3 , Huang Kaiqin-Sad Lovers.MP3
4 , Huang Can-Yellow Rose.lrc
5 , Gigi Lai-such and such a love story.mp3

code 1: show all content
@echo off
for /f %%i in ( song list.txt) do echo %%i
pause>nul
operation result:
serial number, singer name-song name. suffix
1 , Rao Tianliang-rose lover.wma
2 , high song-I don't want to miss.mp3
3. Huang Kaiqin-Sad Lovers.MP3
4. Huang Can-Yellow Rose.lrc
5. Gigi Lai-Such a Love Story.mp3 Explanation

:
    If the parameter "/f" is not used, the running result will only display the text characters in brackets "song list.txt", but cannot read the content of the text file "song list.txt". It can be seen that "/f" is a good tool for parsing text strings.

1. If only the serial number is needed for delims
    , how can it be done without the singer name, song name and suffix name?
Code 2: Extract the first column by default
@echo off
for /f "delims= , " %%i in (song list.txt) do echo %%i
pause>nul
Running result:
serial number
1
2
3
4
5

Explanation:
    "delims = , "means to define a comma "," as a separator, and use the separator "," to split the text string. The string is the content of "songlist.txt", which is the text and punctuation in the file.
The comma is in the original text. In addition to the comma ",", there are also minus signs "-" and dots "." in the original text, so you can also use them as separators.

Code 3: Use minus sign "-" as separator
@echo off
for /f "delims=-" %%i in ( songlist.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

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=327002642&siteId=291194637
Recommended