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=:,。”將其屏蔽掉。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM