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

[文本处理] 批处理如何删除多个文本中指定字符/关键字/字符串所在行之前的所有行?

[复制链接]
发表于 2011-11-18 16:18:12 | 显示全部楼层 |阅读模式
本帖最后由 pcl_test 于 2016-8-5 20:35 编辑

批处理怎样查找指定关键字读取txt中所在行,删除关键字前面行
  1. @echo off
  2. for /f "delims=" %%i in ('dir /s/b *.txt') do (
  3.         findstr "#" "%%i" >> op.txt
  4. )
  5. start op.txt
  6. exit
复制代码
同一文件夹下有多个txt,每个txt中行数各不相同,列数各不相同。
其中每个txt里任意一行的行首以#开头,且只有一行。
我想找到每个txt中以#开头的行,并将之前的行全删除,保留包括#开头的行在内的以下各行形成新的txt文件。
请问该如何实现?我百度的这个只能找到#开头的行,请问如何修改?
发表于 2011-11-18 16:21:42 | 显示全部楼层
  1. sed "/^#/,$!d" a.txt >a_new.txt
复制代码
发表于 2011-11-18 16:56:07 | 显示全部楼层
手机打的,自己修改下。
for  /f  "tokens=1* delims=#:"  %%a  in  ('findstr  /n /b "#" 123.txt')  do echo:%%b| more /+%%a
 楼主| 发表于 2011-11-19 12:33:18 | 显示全部楼层
好像不行啊,版主。我发其中的2个txt帮忙看下
发表于 2011-11-19 14:24:57 | 显示全部楼层
回复 4# lwbu571


    如果你要#的话,简单点:

  1. more  +7  a.txt>>new_a.txt
复制代码

7表示#开始的行。
复杂点:

  1. for /f "tokens=1* delims=#:" %%a in ('findstr /n /b "#"  d:\a.txt') do  echo;%%b&more +%%a  d:\a.txt
复制代码
发表于 2011-11-19 14:28:55 | 显示全部楼层
回复 4# lwbu571


    早贴附件就好了...这题吧,可以只取以 # 或空格开头的行:
  1. findstr /bc:"#" /c:" " a.txt
复制代码
也可以排除以字母为首的行:
  1. findstr /vb "[a-Z]" b.txt
复制代码
如果原文件格式与样本不符,那按楼主原意就是这样:
  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.    set str=%%a
  4.    setlocal enabledelayedexpansion
  5.    if "!str:~,1!"=="#" set echo=yes
  6.    for /f "delims=" %%b in ("!echo!") do (
  7.       endlocal
  8.       set echo=%%a
  9.    )
  10. )
  11. pause
复制代码
或者不开变量延迟:
  1. @echo off
  2. for /f "delims=" %%a in (a.txt) do (
  3.    for /f "delims=#" %%b in ("@%%a") do if %%b==@ set echo=yes
  4.    if defined echo echo %%a
  5. )
  6. pause
复制代码
 楼主| 发表于 2011-11-19 15:22:07 | 显示全部楼层
我晕,都是我的错啊。我上传附件以#开头的行都在第7行,所以版主可能误解我的原意了。
我的问题是多个txt;
以#开头的行数在各个txt中不一样,可能为2,7,10等等;我原本是计划找到#开头行获得行号,再删除#开头行的各个txt中之前的那些行
 楼主| 发表于 2011-11-19 15:47:33 | 显示全部楼层
大概是懂了,呵呵,不过只能找一个txt,多个要怎么循环?
还请劳烦版主明示,我想将结果生成新的txt,名字与原来相同。
发表于 2011-11-19 17:03:22 | 显示全部楼层
回复 8# lwbu571
既然sed那么好用,为什么不用呢?

  1. @echo off
  2. for /f "delims=" %%i in ('dir /b /s *.txt') do (
  3.   sed -ni "/^#/,$p" "%%i"
  4. )
复制代码
发表于 2011-11-19 18:00:25 | 显示全部楼层
回复 9# weichenxiehou
  1. sed -n -i "/^#/,$p" "%%i" *.txt
复制代码
发表于 2011-11-19 19:57:54 | 显示全部楼层

  1. @set @n=0/*
  2. @echo off
  3. for /f "delims=" %%i in ('dir /b *.txt') do (
  4.     cscript.exe -e:jscript "%~f0" "%%i" >>op.txt
  5. )
  6. exit /b
  7. */

  8. fso = new ActiveXObject("Scripting.FileSystemObject");
  9. s = fso.OpenTextFile(WScript.Arguments(0)).ReadAll();
  10. a = s.match(/^#/m);
  11. if(a) WScript.Echo( s.slice(a.lastIndex-1) );
复制代码

评分

参与人数 1PB +5 技术 +1 收起 理由
zqz0012005 + 5 + 1 谁说没人用JS?

查看全部评分

 楼主| 发表于 2011-11-20 10:54:43 | 显示全部楼层
本帖最后由 CrLf 于 2011-11-20 11:35 编辑

呵呵,高手众多。那我在多问句,经过处理后的txt再进一步假设我想在各txt中找GR,SP列另存为新txt应该如何操作。GR,SP列在各txt的位置不同。

——————————————————————————————————
由于楼主已另开新帖,为节省论坛空间,故将原附件删除。 by Crlf
发表于 2011-11-20 11:08:28 | 显示全部楼层
回复 12# lwbu571


    请把所有要求更新到顶楼,再删除 12 楼重复附件
 楼主| 发表于 2011-11-20 11:22:29 | 显示全部楼层
那我从新发帖问好了,谢谢
 楼主| 发表于 2011-11-20 13:58:04 | 显示全部楼层
小结一下下:cjiabing版主代码可用,powerbat 代码可用(但是将所有结果都放在一个txt中,会很大很大。。。);
CrLf 版主代码经新建txt,保存bat后运行貌似没反应,看来我还得好好学习下;
weichenxiehou 、awk 代码运行时提示无sed命令。。。请问是何故?本人XP系统
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-21 07:52 , Processed in 0.034639 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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