[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 求助,用批处理如何删除文件里的某些行。

本帖最后由 smatenchen 于 2022-11-11 22:18 编辑


求助,用批处理如何删除文件里的某些行。


1,
问题,有一个文件 1.txt,其内容如下,

……
[111]
……
[222]
……
……
……
……
[333]
……


其中……代表已省略的内容。


2,
要求,
删除 1.txt 里[222]所在行之下,[333]所在行之上的各行,其余要保留。
即,只删除[222]与[333]之间的各行,其余要保留。


3,
请大神们帮忙!感谢!

本帖最后由 smatenchen 于 2022-11-13 09:31 编辑

回复 31# qixiaobin0715 terse BAT221110 hfxiang idwma Batcher
  1. @echo off
  2. (for /f "delims=" %%i in (1.txt) do (
  3.     if "%%i"=="[333]" set n=
  4.     if not defined n echo,%%i
  5.     if "%%i"=="[222]" set n=true
  6. ))>temp.log
  7. move temp.log 1.txt
  8.    
复制代码
  
  1. if "%%~a"=="[333]" set /a b=1
  2. if !b! EQU 1 echo;%%a
  3. if "%%~a"=="[222]" set /a b=0
复制代码


1,
非常感谢!


2,
哦!好主意!
那是,插入代码功能。


有需要时,的确是应该使用它的,以方便复制代码。


3,
感谢大神们帮忙!
非常感谢!

TOP

回复 30# smatenchen
你不会使用这个吗,看起来好别扭:
代码部分或文本示例使用 [code][/code] 标记括起来(单击回复框的 <> 按钮,复制粘贴代码进去),以便复制。

TOP

本帖最后由 smatenchen 于 2022-11-13 10:12 编辑

回复 12# qixiaobin0715 terse BAT221110 hfxiang idwma Batcher
  1. @echo off
  2. (for /f "delims=" %%i in (1.txt) do (
  3.     if "%%i"=="[333]" set n=
  4.     if not defined n echo,%%i
  5.     if "%%i"=="[222]" set n=true
  6. ))>temp.log
  7. move temp.log 1.txt
复制代码



  1. if "%%~a"=="[333]" set /a b=1
  2. if !b! EQU 1 echo;%%a
  3. if "%%~a"=="[222]" set /a b=0
复制代码



1,
非常感谢!


2,
大神 qixiaobin0715 参考了第8楼大神 hfxiang 的解法,修改后写出的解法,
已知是最轻巧无bug的解法,了不起。


qixiaobin0715 和 hfxiang,两位大神,都非常了不起,尤其是大神 hfxiang,
没有 hfxiang 的珠玉解法在前,这道题难解得很。


大神 hfxiang,具有突破性创新思维,是难得的英才,实在是了不起。


3,
感谢大神们的帮忙!我再去调整组合一下,我的题就有解法了。
非常感谢!

TOP

回复 28# terse BAT221110 qixiaobin0715 hfxiang idwma


1,
非常感谢!


2,
你的解法有用,不过解法有点复杂了。


我之前也想用行号法去解题,所以解法也搞得很复杂。


而其他大神们的解法,则是很轻巧,好似四两拨千斤。


用其他大神们的解法,较为好用。
还是不要用行号法了,行号法实在是复杂了一点。


3,
感谢大神们的帮忙!

TOP

本帖最后由 terse 于 2022-11-12 11:47 编辑

纯p
  1. @echo off
  2. rem 存为ANSI文件
  3. for /f "delims=:" %%a in ('findstr /bln "[222] [333]" 1.txt') do (
  4.       if defined a (set b=%%a) else set a=%%a
  5. )
  6. (for /f "tokens=1* delims=:" %%a in ('findstr /n "." 1.txt') do (
  7.      set "var=%%b"
  8.      setlocal enabledelayedexpansion
  9.     if %%a leq %a% (
  10.         echo;!var!
  11.      ) else if %%a geq %b% echo;!var!
  12.      endlocal
  13. ))>#.tmp
  14. move #.tmp 1.txt
  15. pause
复制代码

TOP

回复 26# BAT221110

TOP

对的。似乎BAT没有直接编辑文件的内置命令。如果能用外置命令的话,用ED、AWK这些行编辑器都能搞定。


回复  hfxiang qixiaobin0715 Batcher idwma BAT221110


1,
非常感谢!


2,
要求,
删除 1.t ...
smatenchen 发表于 2022-11-10 16:37

TOP

回复 19# BAT221110 qixiaobin0715 hfxiang idwma


1,
非常感谢!


2,
是的,大神们的解法都很不错,给了我很大的提示。


我刚开始时,没看明白。


不过,有的代码有点小bug。

TOP

本帖最后由 smatenchen 于 2022-11-13 10:12 编辑

回复 8# hfxiang idwma qixiaobin0715 BAT221110 Batcher
  1. @echo off
  2. @rem 保存为ANSI格式
  3. setlocal enabledelayedexpansion
  4. set /a b=1
  5. for /f %%a in (1.txt) do (
  6. if "%%~a"=="[222]" set /a b=0
  7. if "%%~a"=="[333]" set /a b=1
  8. if !b! EQU 1 echo;%%a
  9. )
复制代码


1,
非常感谢!


2,
if "%%~a"=="[222]" set /a b=0
if "%%~a"=="[333]" set /a b=1
if !b! EQU 1 echo;%%a


有这些代码,会把[222]这一行也删除,这就破坏文件结构了。


我说的,没错吧?这应是个bug了,一点小瑕疵。


3,
请答疑!
非常感谢!

TOP

本帖最后由 smatenchen 于 2022-11-13 10:11 编辑

回复 8# hfxiang idwma qixiaobin0715 BAT221110 Batcher

  1. @echo off
  2. @rem 保存为ANSI格式
  3. setlocal enabledelayedexpansion
  4. set /a b=1
  5. for /f %%a in (1.txt) do (
  6. if "%%~a"=="[222]" set /a b=0
  7. if "%%~a"=="[333]" set /a b=1
  8. if !b! EQU 1 echo;%%a
  9. )
复制代码



1,
非常感谢!


2,
你的解法不错,给了我很大的提示。感谢!


3,
我遇到了难题,故在第1楼发帖时特意简化了问题,既然大神们如此轻巧就给了我帮忙,
看来最终的难题,没有那么难办。


现将完整问题写出来,请大神们帮忙解决我最终的难题。


4,
问题,
有一个文件 1.txt,其内容如下,


……
[???]
……
[222]
……
……
……
……
[???]
……


其中……代表已省略的内容。


文件由类似[222]这样的多个段落组成,[???]代表段落名称未知。
[222],[???],这些代表文件结构。


凡是出现[???]时,就代表已是另一个段落了。


[222],这个段落名称是已知的,其它段落名称未知。


[222],这个段落出现在文件里第几行,是随机的,
一旦出现后,其位置就固定了。


5,
要求,
删除 1.txt 里[222],这个段落里的各行,其它段落不能删除,
[222]这个段落名称行要保留,文件结构不能破坏。


6,
请大神们帮忙,写出解法代码!
非常感谢!

TOP

回复 21# hfxiang
代码简洁,效率高。不过有些人看着这么多斜杠反斜杠会头晕,实际上我也是

TOP

回复 20# qixiaobin0715


相对于纯P,俺更喜欢第3方工具,如gawk、sed:

1.删除两匹配行([222],[333])之间的行,两匹配行都保留
  1. gawk "/\[222\]/{print;while((getline)>0)if(/\[333\]/){print;next}}1" 1.txt>2.txt
复制代码
  1. sed -i -r -e "/\[222\]/,/\[333\]/{/\[222\]/p;/\[333\]/p;d;}" 1.txt
复制代码
2.保留首匹配行
  1. gawk "/\[222\]/{print;while((getline)>0)if(/\[333\]/)next}1" 1.txt>2.txt
复制代码
  1. sed -i -r -e "/\[222\]/,/\[333\]/{/\[222\]/p;d;}" 1.txt
复制代码
3.保留末匹配行
  1. gawk "/\[222\]/{while((getline)>0)if(/\[333\]/){print;next}}1" 1.txt>2.txt
复制代码
  1. sed -i -r -e "/\[222\]/,/\[333\]/{/\[333\]/p;d;}" 1.txt
复制代码
4.两匹配行都不保留
  1. gawk "/\[222\]/,/\[333\]/{next}1" 1.txt>2.txt
复制代码
  1. sed -i -r -e "/\[222\]/,/\[333\]/d" 1.txt
复制代码

TOP

参考8楼兄弟的代码:
  1. @echo off
  2. (for /f "delims=" %%i in (1.txt) do (
  3.     if "%%i"=="[333]" set n=
  4.     if not defined n echo,%%i
  5.     if "%%i"=="[222]" set n=true
  6. ))>temp.log
  7. move temp.log 1.txt
复制代码

TOP

楼上兄弟的方法没问题啊


回复  qixiaobin0715 hfxiang Batcher


1,
非常感谢!


2,
各位大神的解法,看似都不能解题, ...
smatenchen 发表于 2022-11-10 16:48

TOP

返回列表