zoukankan      html  css  js  c++  java
  • DOS批处理:FOR中的Delims和Tokens参数

    在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 
    运行结果: 
    序号 





    讲解: 
    "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、饶天亮-玫瑰爱人.wma”将被分隔成“1”、“饶天亮”、“玫瑰爱人”和“wma” 四个部分。 
    从第一行到最后一行,每行的每个部分对应下来相当于一个竖列。因此,原文就有“序号”、“歌手名”、“歌曲名”、“后缀名”四列。 
    一般情况下,只读取第一列的内容。后面的内容需要用tokens选项提取。
    (四)tokens=x,y,m-n 提取列 

    格式: 
    FOR /F "tokens=x,y,m-n" %%I IN (Command1) DO Command2 
    用法: 
    一句话总结:提取列。 
    通俗讲,共同提取每一行的第m小节的内容。 
    因此,可以用该命令来指定提取文本信息。 
    tokens=有时表示提取全部。 
    tokens=m表示提取第m列。 
    tokens=m,n表示提取第m列和第n列。 
    tokens=m-n表示提取第m列至第n列。 
    Tokens=*表示删除每行前面的空格。忽略行首的所有空格。 
    tokens=m*提取第m列以后的所有字符,星号表示剩余的字符。 
    tokens=m,*提取第m列以后的所有字符,星号表示剩余的字符。 
    输出变量的个数由定义了的tokens决定。 
    在 FOR 语句中显式声明 %%i。使用tokens= 隐式声明%%j 和%%k。只要不会引起试图声明高于字母“z”或“Z”的某个变量,则使用tokens= 可以指定最多 26 个输出变量。 

    接着前面的例子“静夜思”。 
    如果我要提取第三小节“举头望明月”,如何做到? 
    @echo off 
    for /f "delims=, tokens=3" %%i in (静夜思.txt) do echo %%i 
    pause>nul 

    讲解: 
    首先用delims=,表示命令要用逗号作为诗句的分隔符将四句分成四小节。然后用tokens=3提取第三小节,即“举头望明月”了。 
    delims=和tokens=共用一对双引号,如果单独用双引号,则FOR命令返回的只能是它们之中的一个。因为在第一节说过,FOR是逐一读取命令的,将delims和tokens分开后,FOR只能一次读取一个,不能一次全部读取。 

    注意: 
    Tokens常和delims一起使用。 
    首先,一行内容被delims用分割符号如逗号等分隔成许多小段或小节。 
    然后,tokens才能提取每行之间对应的这些小段或小节——列。具体看下面例子。 

    例:提取前面例子文本“a.txt”中每行的第三段内容“ccc”、“kkk”、“ggg”、“考试”。 
    @echo off 
    for /f "skip=1 delims=,, tokens=3" %%i in (a.txt) do echo %%i 
    pause>nul 
    注意:为什么kkk不出现呢? 

    例:如何屏蔽掉文本“a.txt”中的标点符号? 
    @echo off 
    for /f "skip=1delims=,, tokens=1-4" %%i in (a.txt) do echo %%i %%j %%k %%l 
    pause>nul 

    讲解: 
    %%i %%j %%k %%l是输出变量,它的个数由tokens后面的(m-n)决定,一般有(n-m+1)个,但不能超过Z。 
    并且%%后面的字母存在先后顺序,%%a %%b是顺向,倒过来则是逆向的。 
    代行号的tokens=m*,星号表示m后面的所有剩余的列。 
    例: 
    for /f "tokens=*" %%i in (a.txt) do echo %%i 
    讲解: 
    没有指定具体的列,"tokens=*"将提取全部列,后面只需一个输出变量%%i。 

    例: 
    for /f "tokens=2*" %%i in (a.txt) do echo %%i %%j 
    讲解: 
    "tokens=2*"提取第二列以后的所有字符,星号表示剩余的字符。输出变量%%i对应于2的输入变量,%%j对应于星号的输入变量。 
    注意: 
    这里没有使用delisms但却以空格分隔了,是因为FOR默认空格是做分隔符的。 

    例:屏蔽掉“易经.txt”中的标点符号: 
    @echo off 
    for /f "tokens=1-5 delims=:," %%a in (易经.txt) do echo %%a %%b %%c %%d %%e 
    pause>nul 
    讲解: 
    当delims定义了两个分隔符“:”和“,”时,提取列要用到tokens。 
    有五个列,所以tokens要定义提取第一列至第五列,即1-5,相应地,后面需要五个输出显示变量%%a %%b %%c %%d %%e。你也可以这样修改,避免过多的变量符号【补充?】 
    你也可以将最后多余的句号定义为分隔符“delims=:,。”将其屏蔽掉。

  • 相关阅读:
    mac os programming
    Rejecting Good Engineers?
    Do Undergrads in MIT Struggle to Obtain Good Grades?
    Go to industry?
    LaTex Tricks
    Convert jupyter notebooks to python files
    How to get gradients with respect to the inputs in pytorch
    Uninstall cuda 9.1 and install cuda 8.0
    How to edit codes on the server which runs jupyter notebook using your pc's bwroser
    Leetcode No.94 Binary Tree Inorder Traversal二叉树中序遍历(c++实现)
  • 原文地址:https://www.cnblogs.com/zhaoshujie/p/10336873.html
Copyright © 2011-2022 走看看