我在同一目录中有歌词文本文件,我想根据这些规则从中删除几行:
A. 删除所有包含方括号 [ ] 的行
B. 从顶部删除三个非空行。
C. 从底部删除两条非空行。
例如,也许像这样的命令行被固定为对多个文件执行 (A)?
type *.txt | findstr /v LYRICS | findstr /v "[" | findstr /v "]" >*.txt
吉尔伯特
我在同一目录中有歌词文本文件,我想根据这些规则从中删除几行:
A. 删除所有包含方括号 [ ] 的行
B. 从顶部删除三个非空行。
C. 从底部删除两条非空行。
例如,也许像这样的命令行被固定为对多个文件执行 (A)?
type *.txt | findstr /v LYRICS | findstr /v "[" | findstr /v "]" >*.txt
吉尔伯特
主要编辑 - 我测试和调试了我的代码。有很多错误。
我认为这应该让你接近。但我仍然不确定我是否理解你的非空状态。
此代码将修改当前目录中的所有 .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 扩展名。
如果您对结果感到满意,您可以删除rem
最后两行前面的 ,然后您的原始文件将被修改后的版本覆盖。如果进行此更改,请确保只运行一次脚本!
第一个 FIND 获取行数的计数,因此我们知道根据行号从底部删除哪些行。
有趣的是第二个 FOR 循环中的大长命令。第一个 FINDSTR 在每行前面加上行号。然后将这些结果通过管道传送到第二个 FINDSTR,该 FINDSTR 根据我对您的要求的理解删除适当的行。
它使用正则表达式。例如,“^1:”是在行首查找“1:”的正则表达式。
双百分比用于底部 1 和底部 2,以便我们可以访问当前值而无需使用延迟扩展。在父批次中,%%bottom1%% 变为 %bottom1%,并传递给 FINDSTR 命令。FOR /F IN() 子句命令在它们自己的 CMD 会话中执行,因此它能够正确扩展 %bottom1% 的当前值。
由于使用了 /v 选项,因此 FINDSTR 保留所有不匹配任何正则表达式搜索字符串的行。在这方面,你走在了正确的轨道上。使用一个 FINDSTR 进行所有过滤会更有效。
FOR /F 选项设置为将每行分成两个标记,在每行的第一个 : 处中断。仅打印第二个令牌。这就是从输出中去除行号前缀的方式。