标题: [文本处理] 批处理如何从文本中提取文件路径 [打印本页]
作者: 刘伶闯天台 时间: 2016-11-7 14:58 标题: 批处理如何从文本中提取文件路径
本帖最后由 pcl_test 于 2016-11-7 15:09 编辑
有一个文本文件如下:
sending incremental file list
deleting test.com/web/测试 包含空格/中文名.txt
deleting test.com/web/测试 包含空格/
deleting test.com/web/new file/test.txt
deleting test.com/web/new file/
deleting test.com/web/index.php
deleting test.com/web/index.html
deleting test.com/web/
deleting test.com/log/
deleting test.com/data/
deleting test.com/
./
baidu.com/web/
sent 717 bytes received 299 bytes 2,032.00 bytes/sec
total size is 52 speedup is 0.05 (DRY RUN)
文中有目录路径,文件路径,只需要取得文件路径,现在需要得到的结果是:
test.com/web/测试 包含空格/中文名.txt
test.com/web/new file/test.txt
test.com/web/index.php
test.com/web/index.html
请教各位批处理该如何写?
作者: pcl_test 时间: 2016-11-7 15:10
for +findstr
http://www.bathome.net/thread-2189-1-1.html
http://bbs.bathome.net/thread-31727-1-1.html
http://www.bathome.net/thread-5814-1-1.html
http://www.bathome.net/thread-75-1-1.html
作者: 小小菜鸟 时间: 2016-11-7 15:23
回复 1# 刘伶闯天台 复制代码
?
作者: 刘伶闯天台 时间: 2016-11-7 15:27
回复 2# pcl_test
不好意思版主,我先想想。
作者: 刘伶闯天台 时间: 2016-11-7 18:54
本帖最后由 pcl_test 于 2016-11-7 20:05 编辑
回复 2# pcl_test
版主你好,写了个批处理现在应该可以达到效果。
文本123.txt内容如下,文本中以【/】结束的都表示的是目录。
批处理代码:- @echo off
- setlocal enabledelayedexpansion
- findstr "deleting" 123.txt > tmp.txt
- for /f "tokens=1,*" %%i in (tmp.txt) do (
- set str=%%j
- :: echo !str:~-1!
- if not "!str:~-1!"=="/" echo %%j
- )
- pause
复制代码
得到结果如下:- test.com/web/娴嬭瘯 鍖呭惈绌烘牸/涓枃鍚?txt
- test.com/web/x.y/x.y.txt
- test.com/web/new file/test.txt
- test.com/web/dd/fff .txt
- test.com/web/index.php
- test.com/web/index.html
- 请按任意键继续. . .
复制代码
1.先使用findstr在123.txt中查找包含【deleting】的行重定向到tmp.txt文件中;
2.然后使用for循环,以默认空格分隔,当切分完第一节之后,切分动作不再继续下去,因为 tokens=1,* 中,星号前面紧跟的是数字1;第一节字符串被切分完之后,其余部分字符串不做任何切分,整体作为第二节字符串,这样,一行就被切分成了两节,分别被变量%%i和变量%%j接收。然后就是判断最后一个字符是不是【/】,如果不是就认为是文件。
虽然可以实现了,对批处理不是很熟悉,请教版主在此例中分辨路径是文件还是目录还有其他方法吗?(结果中的中文乱码可能是因为123.txt文件为UTF-8编码格式,但是findstr重定向后的文件也是UTF-8格式?)
作者: pcl_test 时间: 2016-11-7 20:10
回复 5# 刘伶闯天台
不是本地文件,只好通过路径的特征取区分;有可能是utf-8的
作者: 刘伶闯天台 时间: 2016-11-7 20:28
回复 6# pcl_test
非常感谢,批处理没有什么问题吧?我能想到的就只是通过看最后一位字符是不是【/】来判断了。
作者: DiamondbacK 时间: 2016-11-7 20:53
回复 7# 刘伶闯天台
要选出文件、过滤掉目录,可以把 findstr 命令改成- findstr "^deleting.*[^/]$"
复制代码
作者: pcl_test 时间: 2016-11-8 00:14
- mshta http://bathome.net/s/hta/index.html "type('文本.txt').match(/\bdeleting\b.+[^/\s](?=\s*(\r\n|$))/g).EACH(function(a){return a.replace(/^\S+\s+/,'')}).join('\r\n')"
- pause
复制代码
- powershell -c "gc '文本.txt'|%%{if($_ -match '^\s*deleting\s+(.+?[^/])\s*$'){$matches[1]}}"
- pause
复制代码
作者: CrLf 时间: 2016-11-8 00:39
- mshta http://bathome.net/s/hta/index.html "type('文本.txt').split(/\r?\n/).grep(/^deleting /).join('\r\n').replace(/^.+?\s+/gm,'')"
复制代码
作者: 刘伶闯天台 时间: 2016-11-8 11:40
回复 8# DiamondbacK
非常感谢,学习了。
作者: 刘伶闯天台 时间: 2016-11-8 11:41
回复 9# pcl_test
多谢,我先学习学习。
作者: 刘伶闯天台 时间: 2016-11-8 11:41
回复 10# CrLf
非常感谢。
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |