标题: [文本处理] 批处理怎样截取文本中路径? [打印本页]
作者: freesoft00 时间: 2015-6-1 12:48 标题: 批处理怎样截取文本中路径?
本帖最后由 freesoft00 于 2015-6-1 20:46 编辑
"Program Files (x86)\Internet Explorer\iexplore.exe"
"Program Files (x86)\Internet Explorer\F12Tools.dll"
"Program Files (x86)\Internet Explorer\ie9props.propdesc"
"Program Files (x86)\Internet Explorer\iedvtool.dll"
"Program Files (x86)\Internet Explorer\ieinstal.exe"
"Program Files (x86)\Internet Explorer\ielowutil.exe"
"Program Files (x86)\Internet Explorer\ieproxy.dll"
"Program Files (x86)\Internet Explorer\IEShims.dll"
Windows\System32\amdocl_ld64.exe
Windows\System32\amdocl64.dll
Windows\System32\amdmmcl6.dll
Windows\System32\amdocl_as64.exe
上面是1.txt中文本的样例,我需要截取路径和文件名称。- @echo off
- pushd %~dp0
- for /f "delims=" %%i in (1.txt) do (
- echo,%%~dpi333%%~nxi%
- )>>3.txt
- pause
复制代码
如果使用上面对代码,文件名称截取对了,但是路径不对,路径变为了绝地路径,
比如这个文本1.txt在e:\22\33目录存放,
批处理运行完成后解决的路径都是
e:\22\33\Program Files (x86)\Internet Explorer\333iexplore.exe
而不是我要的下面的解决
Program Files (x86)\Internet Explorer\333iexplore.exe
另外一个问题,如果路径中带有引号的,希望生成后继续有双引号,如果不带有双引号的,那么还保持不带有双 引号
现在的问题:
文本的路径中有*号的处理不正确,
c:\4444\*
"c:\5555\*"
最后通过下面兄弟的代码得到的是
#:*= 333 *
#:*= 333 *
所以不再对带有*号的做处理,批处理在判断末尾是*号的不再生成到3.txt文本中,就是过滤掉。
同时过滤到开头是:冒号的行,比如:
:Windows\System32\amdocl64.dll
这个就不再生成到3.txt文本中
作者: tmplinshi 时间: 2015-6-1 17:56
- sed -r "s/[^\\]+$/333\0/" a.txt > 3.txt
复制代码
点击我签名中的链接下载 sed.exe
作者: freesoft00 时间: 2015-6-1 18:25
回复 2# tmplinshi
感谢,有不用sed,纯批处理或者vbs也可以能解决吗
作者: yangfengoo 时间: 2015-6-1 18:42
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=*" %%a in (1.txt) do (
- set #=%%a
- set #=!#:%cd%=!
- echo,!#:%%~nxa=! 333 %%~nxa
-
- )
-
- pause
复制代码
作者: freesoft00 时间: 2015-6-1 18:44
回复 4# yangfengoo
好的,再次感谢楼上的两位
作者: Bella 时间: 2015-6-1 18:58
本帖最后由 Bella 于 2015-6-1 22:36 编辑
- sed -r "/^:|\*\x22?$/d;s/[^\]+$/333&/" 1.txt>3.txt
复制代码
作者: freesoft00 时间: 2015-6-1 20:30
回复 6# Bella
感谢提供代码!
作者: freesoft00 时间: 2015-6-1 20:36
回复 6# Bella
名称中不能有*号,比如文本的路径是
“c:\win\*"
最后得到的结果是
"333*"
作者: freesoft00 时间: 2015-6-1 20:40
回复 4# yangfengoo
也有同样的问题,路径中不能有*号
c:\4444\*
"c:\5555\*"
最后得到的结果是
#:*= 333 *
#:*= 333 *
主要是我没有把文本的内容说清楚的问题。
作者: freesoft00 时间: 2015-6-1 20:41
在遇到有*号结尾的不做更改也不添加到新的文本中。
作者: freesoft00 时间: 2015-6-1 20:53
文本:
4444\*
4444\*.exe
"5555\3*.exe"
4444\555.*
结果:
333*
333*.exe
"5555\3333*.exe"
4444\333555.*
似乎是对目录的\线后面不能是*号,否则前面的路径就没有了,只剩文件名了。
作者: terse 时间: 2015-6-1 22:54
- @if(0)==(0) echo off & cscript -NoLogo -E:JScript %0 <1.txt "333" >3.txt & pause & exit @end
- var re = /(.*?)([^\\]*$)/;
- var s = WScript.Arguments.Item(0);
- while(!WScript.StdIn.AtEndOfStream){
- var str = WScript.StdIn.ReadLine();
- WSH.Echo(str.replace(
- re, function(a,b,c) {return(b+s+c)}
- ));
- }
复制代码
作者: /zhqsystem/zhq 时间: 2015-6-17 02:52
本帖最后由 /zhqsystem/zhq 于 2015-6-17 02:58 编辑
for /f "tokens=* delims=" %%i in (1.txt) do (
echo=%%i 完整数据
echo=%%~nxi 截取名称和扩展名
echo=%%~dpi 提取路径[带盘符]
echo=%%~pi 提取路径[无盘符]
echo=%%~di 提取盘符[无\]
)
置于保留引号是个问题,没有引号会更好用变量加个引号就可以解决,
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |