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

[文本处理] [已解决]批处理怎样修改文件夹下的所有文件,更新内容并且覆盖原文件?

[复制链接]
发表于 2011-10-12 17:39:20 | 显示全部楼层 |阅读模式
本帖最后由 Dana 于 2011-10-17 09:09 编辑

下面的代码是将一个文件按照行数提取后生成新的文件, 并且将原文件覆盖, 但是代码一次只能完成一个文件的修改, 如何能批量修改一个文件夹下的所有txt文件,  (更新内容并且覆盖原文件), 多谢!  sed 处理后的数据文件在Win 下程序不能正常读取相关内容. 请大家帮忙修改下面的代码, 使之可以批量处理数据. 谢谢!
  1. :: 保留文本中的前 N 行(覆盖原文件) .
  2. @echo off
  3. :: -------- 设置 --------
  4. set File="1.TXT"
  5. set N=18
  6. :: -------- /设置 --------

  7. if not exist %File% exit
  8. if not defined N exit

  9. findstr /n .* %File% > "%temp%\tmp"

  10. (
  11.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  12.         set Var=%%a
  13.         set /a Line = Var
  14.         SetLocal EnableDelayedExpansion
  15.         if !Line! leq !N! echo,!Var:*:=!
  16.         EndLocal
  17.     )
  18. ) > %File%

  19. del "%temp%\tmp"
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2011-10-12 18:30:40 | 显示全部楼层
本帖最后由 hfg1977 于 2011-10-12 18:33 编辑

  1. sed -i "1,18 !d" .\path\*.txt
  2. del sed??????
复制代码


修改文件: 保留.\path目录下的所有文本的1~18行.
危险命令,不懂勿试.
 楼主| 发表于 2011-10-12 18:42:36 | 显示全部楼层
测试成功, 但是我提取后的内容怎么都在一行呢, 格式不对.
发表于 2011-10-12 19:07:53 | 显示全部楼层
RE:"提取后的内容怎么都在一行呢"

很常见的问题, 你的原始文件没使用ms标准的换行符号, 你会看到每行后面跟个黑色方块. 并不影响使用.

这个命令 "转换Unix新行符(LF)为DOS格式"

  1. sed -i "s/$//" .\path\*.txt
  2. del sed??????
复制代码

评分

参与人数 1技术 +1 收起 理由
Dana + 1 学到很多

查看全部评分

发表于 2011-10-12 19:52:02 | 显示全部楼层
  1. sed -i "1,25 !d" Y8L7NA11A0411068_BC.txt
复制代码
没任何问题呀, 正常换行.
 楼主| 发表于 2011-10-12 21:15:59 | 显示全部楼层
本帖最后由 Dana 于 2011-10-12 21:17 编辑

使用 sed 处理后的数据, Windows环境程序不能提取内容. 不过还是感谢hfg1977 的帮忙. 谢谢!
发表于 2011-10-12 21:25:25 | 显示全部楼层
RE: 看你提供的"Y8L7NA11A0411068_BC.txt" 是ANSI格式, 检查原始文件格式是否是UNICODE.
 楼主| 发表于 2011-10-12 21:42:50 | 显示全部楼层
已经确认原始文件格式是ANSI格式. 我的测试环境是XP Cmd. sed版本4.0.7
发表于 2011-10-12 23:07:56 | 显示全部楼层
本帖最后由 xudaweb 于 2011-10-12 23:31 编辑

回复 1# Dana
写成两个batch分两步走:
1,先把下面这个batch改成处理%1的动态环境变量,如命名为get_lines.cmd
  1. @echo off
  2. set N=5
  3. if not exist %1 exit
  4. if not defined N exit

  5. findstr /n .* %1> "%temp%\tmp"
  6. (
  7.     for /f "usebackq delims=" %%a in ("%temp%\tmp") do (
  8.         set Var=%%a
  9.         set /a Line = Var
  10.         SetLocal EnableDelayedExpansion
  11.         if !Line! leq !N! echo,!Var:*:=!
  12.         EndLocal
  13.     )
  14. ) > %1
  15. del "%temp%\tmp"
复制代码
2,再执行下面这个batch循环执行结束就可以了,如命名doall.cmd
  1. @echo off

  2. for %%i in (*.txt) do (
  3. get_lines.cmd %%i
  4. )
复制代码
只需执行doall.cmd一个batch,就可以实现需求了!就是文件名有空格之类的特殊情况就不管用了...

评分

参与人数 1技术 +1 收起 理由
Dana + 1 乐于助人

查看全部评分

 楼主| 发表于 2011-10-12 23:47:28 | 显示全部楼层
多谢 xudaweb  回复, 明早测试数据后回复, 谢谢!
 楼主| 发表于 2011-10-13 10:35:53 | 显示全部楼层
回复 9# xudaweb

参数传递就可以了, 谢谢!

但是还有个问题, 处理后数据文件的行数多了一个空行,  比如说我只需要25行, 但是实际是26行, 最后多了一个空行.
发表于 2011-10-17 22:25:53 | 显示全部楼层
本帖最后由 xudaweb 于 2011-10-17 22:27 编辑

回复 11# Dana

测试了下,是有你说的这个问题,暂时还没找到删除最后一行空行的办法...
哪位高手知道怎么处理,贴上代码让我们学习学习啊...
发表于 2011-10-17 22:43:59 | 显示全部楼层
发表于 2011-10-17 23:27:07 | 显示全部楼层
回复 13# Batcher
多谢版主的热心肠,刚看到原楼主另开一贴专门讨论。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 06:15 , Processed in 0.022503 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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