我在同一目录中有歌词文本文件,我想根据这些规则删除几行:
一个。删除包含方括号[]
的所有行B中。从顶部删除三个非空行。
℃。从底部删除两个非空行。
例如,对于多个文件,可能会修复此命令行(A)吗?
type *.txt | findstr /v LYRICS | findstr /v "[" | findstr /v "]" >*.txt
吉尔伯特
答案 0 :(得分:1)
主要编辑 - 我测试并调试了我的代码。有很多错误。
我认为这应该让你接近。但我仍然不确定我是否理解你的非空状态。
此代码将修改当前目录中的所有.TXT文件。对于每个文件,它应删除前3行,后2行以及包含[或]的任何行。任何以:开头的行在第一个位置将具有前导:剥离。
@echo off
for %%F in (*.txt) do (
for /f %%N in ('find /c /v "" ^<"%%F"') do set bottom1=%%N
set /a bottom2=bottom1-1
(
for /f "tokens=1* delims=:" %%A in (
'findstr /n "^" "%%F" ^| findstr /vr /c:"\[" /c:"\]" /c:"^1:" /c:"^2:" /c:"^3:" /c:"^%%bottom1%%:" /c:"^%%bottom2%%:"'
) do echo(%%B
)>"%%~nF.mod"
rem del "%%F"
rem ren "%%~nF.mod" "%%~nxF"
)
如上所述,原始文件将被保留,修改后的版本将具有相同的名称,但扩展名为.mod。
如果您对结果感到满意,可以从最后2行的前面删除rem
,然后使用修改后的版本覆盖原始文件。如果进行此更改,请确保只运行一次脚本!
第一个FIND获取行数,因此我们知道根据行号从底部删除哪些行。
有趣的是第二个FOR循环中的大长命令。第一个FINDSTR在每行前面加上行号。然后将这些结果传送到第二个FINDSTR,根据我对您的要求的理解,删除相应的行。
它使用正则表达式。例如,“^ 1:”是一个在一行开头查找“1:”的正则表达式。
双倍百分比用于bottom1和bottom2,这样我们就可以在不使用延迟扩展的情况下访问当前值。在父批处理中,%% bottom1 %%变为%bottom1%,这将传递给FINDSTR命令。 FOR / F IN()子句命令在它们自己的CMD会话中执行,因此它能够正确地扩展%bottom1%的当前值。
由于使用了/ v选项,FINDSTR会保留所有与任何正则表达式搜索字符串都不匹配的行。在这方面你是在正确的轨道上。使用一个FINDSTR进行所有过滤效率更高。
FOR / F选项设置为将每一行分成两个标记,在第一行中断:在每一行中。仅打印第二个标记。这就是从输出中删除行号前缀的方式。