![Board logo](images/default/logo.gif)
标题: [文本处理] 【已解决】如何批量将文件名插入到文本第1行和第2行之间? [打印本页]
作者: wzf1024 时间: 2016-3-28 16:27 标题: 【已解决】如何批量将文件名插入到文本第1行和第2行之间?
本帖最后由 wzf1024 于 2016-3-28 23:33 编辑
有很多txt文本,文件名不同,如何批处理把文件名插入成为第2行,其他内容后退,
比如有文本名为hello.txt,内容是:
1111111111111
2222222222222
3333333333333
……
操作后实现:
1111111111111
hello
2222222222222
3333333333333
……
哪位大侠帮忙菜鸟,谢谢
作者: happy886rr 时间: 2016-3-28 16:46
回复 1# wzf1024 - @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%A in ('dir /a-d /b /s *.txt') do (
- (for /f "tokens=1* delims=:" %%a in ('type "%%A"^|findstr /n .*') do (
- if %%a equ 2 (echo,%%~nA)
- echo,%%b
- ))>"%%A.bak"
- del "%%A"
- ren "%%A.bak" "%%~nxA"
- )
- set /p =执行完毕!
复制代码
作者: pcl_test 时间: 2016-3-28 22:38
本帖最后由 pcl_test 于 2016-3-28 23:13 编辑
- @echo off
- ::取决more的限制
- for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
- (
- set/pa=
- setlocal enabledelayedexpansion
- echo;!a!
- endlocal
- echo;%%~na
- more +1
- )<"%%a">$
- move $ "%%a"
- )
- pause
复制代码
作者: pcl_test 时间: 2016-3-28 22:56
回复 2# happy886rr
要是首字符为:呢
作者: CrLf 时间: 2016-3-28 23:26
回复 3# pcl_test
不需要用 more +1 吧,因为 set /p 已经取走一行了,另外,建议把 set /p a= 放到 setlocal 之后,否则应事先 set "a="
作者: wzf1024 时间: 2016-3-28 23:33
happy886rr大虾的处理的确会把行首的:删除,但容易扩展成把文件名插入任意行间;
pcl_test大虾的处理考虑周到,但只能把文件名插入1行和2行间,似乎扩展不了(可能我菜,不懂扩展)。
但目的达到,非常感谢各位大虾!!
作者: CrLf 时间: 2016-3-28 23:47
gawk 也是个好选择:- @echo off
- for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
- gawk "FNR==2{print FILENAME};1" "%%a" >$
- ren $ "%%a"
- )
复制代码
作者: pcl_test 时间: 2016-3-28 23:57
回复 5# CrLf
什么鬼
作者: pcl_test 时间: 2016-3-29 00:07
- /*&cls
- @echo off
- ::指定在第一行之后插入
- set n=1
- dir /a-d /b *.txt|cscript -nologo -e:jscript "%~f0" %n%
- pause&exit
- */
- var fso = new ActiveXObject('Scripting.FileSystemObject');
- while(!WScript.StdIn.AtEndOfStream){
- var file = WScript.StdIn.ReadLine();
- var i = 0, s = '', f = fso.OpenTextFile(file, 1);
- while(!f.AtEndOfStream){
- if(i == WScript.Arguments(0))s += fso.GetFile(file).Name.replace(/\.[^\.]+$/, '') + '\r\n';
- var str = f.ReadLine();
- s += str + '\r\n';
- i++;
- }
- f.Close();
- var f = fso.OpenTextFile(file, 2);
- f.Write(s);
- f.Close();
- }
复制代码
作者: CrLf 时间: 2016-3-29 00:47
本帖最后由 CrLf 于 2016-3-29 01:16 编辑
回复 8# pcl_test
比如这样:- @echo off
- for /f "delims=" %%a in ('dir /a-d /b *.txt') do (
- (
- setlocal enabledelayedexpansion
- set/pa=
- echo;!a!
- endlocal
- echo;%%~na
- find /v ""
- )<"%%a">$
- move $ "%%a"
- )
- pause
复制代码
---------------------------------------
实测发现 3 楼 more +1 的用法无误
那么问题来了,set /p 已经取走第一行了,为什么 more 还能再得到一个首行?
作者: CrLf 时间: 2016-3-29 01:07
hta 版:- mshta http://bathome.net/s/hta/ "var n=1; dir().files().grep(/\.txt$/i)._each(function(f){var a=type(f).split('\r\n');a.splice(n,0,f.replace(/\.[^.]+$/,''));save(a.join('\r\n'),f)})"
复制代码
作者: wzf1024 时间: 2016-3-29 13:23
喔,大家讨论激烈,看来我们论坛很有活力啊
作者: xp3000 时间: 2016-3-29 23:43
顶一下帖子上去,貌似以后要用到
作者: CrLf 时间: 2016-3-30 00:34
回复 12# happy886rr
可以改用 "delims=" ... set "str=%%a" & setlocal enabledelayedexpansion & echo !str:*:=! & endlocal,一样可以兼容特殊字符
作者: happy886rr 时间: 2016-3-30 00:43
本帖最后由 happy886rr 于 2016-3-30 00:52 编辑
回复 15# CrLf
不错,看来这招可行。
作者: CrLf 时间: 2016-3-30 00:58
遗留问题:
more 为什么能取得已经被 set /p 取走的内容?
作者: happy886rr 时间: 2016-3-30 01:02
本帖最后由 happy886rr 于 2016-3-30 01:06 编辑
回复 17# CrLf
他不是外层加了一组括号吗?当成一行命令了,把文本more +1)<“%%a”, 延迟也在more之前就关了。
作者: CrLf 时间: 2016-3-30 01:12
回复 18# happy886rr
做个实验:- @echo off
- (
- echo 第一行
- echo 第二行
- echo 第三行
- echo 第四行
- )>a.txt
-
- (
- setlocal enabledelayedexpansion
- set /p line_1=
- echo;line_1=!line_1!
- rem 取得第一行缓冲区
-
- set /p line_2=
- echo;line_2=!line_2!
- rem 取得第二行缓冲区
-
- find /n /v ""
- rem more 和 find 等第三方居然能获取完整的重定向输入
-
- set /p line_null=
- echo;line_null=!line_null!
- rem 之后再用 set /p 就无法取得重定向输入了
- )<a.txt
- pause
复制代码
作者: happy886rr 时间: 2016-3-30 01:37
回复 19# CrLf
我觉得find和more是针对整个文本来的,不存在部分重定向输入,永远也做不到部分行重定向给find、more。它们一次性就独吞了,不留后路。
作者: happy886rr 时间: 2016-4-1 17:10
回复 3# pcl_test
set/p可以保真的获取绝大多数特殊字符行,不过尾部的tab制表符全部被过滤了。文本无损处理还是得靠第三方。
作者: apython 时间: 2016-4-1 17:45
- @echo off
- setlocal enabledelayedexpansion
- for /f "delims=" %%i in ('dir /s/b/l/aa *.txt') do (
- for /f "delims=" %%a in (%%i) do (
- set/a n+=1
- if !n! equ 1 set "a1=%%a"
- if !n! equ 2 set "a2=%%a"
- )
- set n=0
- for /f "skip=2 delims=" %%b in (%%i) do (
- set/a a+=1
- if !a! equ 1 (echo,!a1!
- echo,%%~ni
- echo,!a2!)>%temp%\%%~nxi
- echo,%%b >>%temp%\%%~nxi
- )
- set a=0&set a1=&set a2=
- move /y "%temp%\%%~nxi" "%%i"
- )
- pause
复制代码
作者: codegay 时间: 2016-4-3 13:19
- """
- python文件名插入指定行.py
- http://bbs.bathome.net/thread-39833-1-1.html
- 2016年4月3日 13:08:57 codegay
- """
- fn="temp.txt"
- with open(fn) as f:
- txt=f.readlines()
- txt.insert(3,fn+"\n")#文件名加上换行符号插入第四行
-
- with open(fn,"w+") as f:
- f.writelines(txt)
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |