找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 28398|回复: 14

[文本处理] for命令的delims和tokens怎么搭配使用分割字段

[复制链接]
发表于 2016-8-28 22:51:55 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-8-29 17:12 编辑

for /f delims tokens的问题
如果每行的文本有多个相同的分隔符怎么办?
比如
4、情歌-经典-黄灿-黄玫瑰.mp3
里面有3个-做分隔符,但是我想截取黄灿-黄玫瑰.mp3
那delims=-是不是没用?比如要delims=- - -,然后借用tokens=34才行?
或者有其它方法请明示。

评分

参与人数 1PB -3 收起 理由
pcl_test -3 发帖前先使用论坛搜索

查看全部评分

发表于 2016-8-28 23:08:28 | 显示全部楼层

  1. @echo off && setlocal enabledelayedexpansion
  2. if exist 2.txt (del /f /q 2.txt)
  3. for /f "delims=" %%i in (1.txt) do (
  4. set "var=%%i"
  5. for /f "tokens=3,4 delims=-" %%a in ("!var!") do (
  6. echo %%a-%%b>>2.txt
  7. )
  8. )
复制代码
【代码分析】
1.对tokens=3,4
发表于 2016-8-28 23:20:52 | 显示全部楼层
回复 2# 诗歌王位
  1. @echo off
  2. for /f "tokens=2,* delims=-" %%i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (
  3.     echo,%%j
  4. )
  5. pause
复制代码
2,* 比 3,4 更加灵活
 楼主| 发表于 2016-8-28 23:28:04 | 显示全部楼层
本帖最后由 lyonamstrong 于 2016-8-28 23:30 编辑

试了下,如果把一行文本分隔成3块,要显示任意两块,23或者2,3或者2,*都不行。难道是我的姿势不对……
但是单独显示2或者3是可以的,所以分隔是没问题
发表于 2016-8-29 07:35:01 | 显示全部楼层
这个时候,你该亮剑了,亮出你的代码啊。。。。。。同意3楼观点
[代码分析]
1.那个文本还是单个字段处理你都没有明确,注意下2楼的字段,即源文件都是放在1.txt的
发表于 2016-8-29 08:30:22 | 显示全部楼层
本帖最后由 happy886rr 于 2016-8-29 08:37 编辑

回复 5# 诗歌王位 一行流
  1. @echo off&(for /f "delims=" %%A in ('type 1.txt') do (for /f "tokens=2* delims=-" %%a in ("%%A") do (echo %%b)))>2.txt
复制代码
发表于 2016-8-29 09:34:07 | 显示全部楼层
回复 4# lyonamstrong


你要显示哪两块?把测试用例和测试结果分别发出来看看。
 楼主| 发表于 2016-8-29 10:01:00 | 显示全部楼层
就是3楼的那条代码
for /f "tokens=2,* delims=-" %%i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (echo %%i)
我直接在cmd中打,所以是
for /f "tokens=2,* delims=-" %i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (echo %i)
并不能显示 经典-黄灿-黄玫瑰.mp3
显示的是 经典
也就是说 ,*不起作用
发表于 2016-8-29 10:06:03 | 显示全部楼层
for /f "tokens=2,* delims=-" %i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (echo %j)
发表于 2016-8-29 10:12:10 | 显示全部楼层
回复 8# lyonamstrong


    请仔细观察3楼代码,设置循环变量的时候从%%i开始,但是使用的时候是%%j
 楼主| 发表于 2016-8-29 10:19:28 | 显示全部楼层
本帖最后由 lyonamstrong 于 2016-8-29 14:01 编辑

还想问问清楚

单个部分显示的实现了:
for /f "delims=、,-,. tokens=3" %a in (110.txt) do echo %a

单个部分一直到结尾显示也实现了:
for /f "delims=、,-,. tokens=2*" %a in (110.txt) do echo %a%b

但是显示当中几项的却存疑:
for /f "delims=、,-,. tokens=23" %a in (110.txt) do echo %a%b 这样无法实现
for /f "delims=、,-,. tokens=2,3" %a in (110.txt) do echo %a,%b 这样实现了,但是间隔号不是原来的“-”而是改成了“,”
我想请问有什么办法直接保留原来的间隔符号不变?

还有如果是5部分,那tokens=1245如何实现?我试过了,12或45都无法实现。
 楼主| 发表于 2016-8-29 15:20:39 | 显示全部楼层
please
问完这个我就不问了
发表于 2016-8-29 15:39:01 | 显示全部楼层
回复 12# lyonamstrong
请认真查看for的基础教程
就没有tokens=1245这种写法,都是写为tokens=1,2,4,5
 楼主| 发表于 2016-8-29 17:48:04 | 显示全部楼层
回复 13# happy886rr


    阿里嘎多!
发表于 2016-8-29 19:18:44 | 显示全部楼层
回复 11# lyonamstrong


    建议把tokens放前面delims放后面
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 12:41 , Processed in 0.017758 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表