我正在尝试通过删除某些行号来编辑 txt 文件。 我想搜索包含 .txt 的文件夹中的所有文件,删除一些行,然后使用带有 -edit.txt 的输入文件名保存文件
如:input.txt > input-edit.txt。
这就是我现在所拥有的:
@echo off (for /f "tokens=1,* delims=[]" %%a in ('type *.txt^|find /v /n ""') do (
echo/|findstr /x "34 35 36 37 38 39 40 41 42 43 80 81 82 83 84 85 86 87 88 89" >nul || echo/%%b
))>%%~na-edit.txt
但是创建的文件名是%~na-edit.txt
有人可以帮助我吗?
谢谢!
您的代码的作用是:
连接每个
.txt
文件并为每行编号%%a
中的行号和
%%b
中的行内容
echo
在 findstr
中插入一个空行并尝试查找数字,丢弃结果echo
行内容所以 - 没有必要尝试将所有这些都放在一行上 - 这是更传统的布局:
@echo off
(
for /f "tokens=1,* delims=[]" %%a in ('type *.txt^|find /v /n ""') do (
echo/|findstr /x "34 35 36 37 38 39 40 41 42 43 80 81 82 83 84 85 86 87 88 89" >nul || echo/%%b
)
)>%%~na-edit.txt
由于
%%a
在 for
循环之外,%%a
不在上下文中,因此 %%~na-edit.txt
被解析为 %%
=>%
,其余字符没有特殊含义,因此 %~na-edit.txt
.
即使明显的意图起作用,
%%a
是行号,而不是文件名。
此外,由于没有
&
将 @echo off
与余数分开,因此有效代码为
@echo off>%%~na-edit.txt
因为超出
off
的任何内容都会被丢弃。
find
的最终输出将是
[1]line 1 of file 1
…
[41]line 41 of file 1
[42]line 1 of file 2
…
这是一个未经测试的想法
@echo off
setlocal
for /f "delims=" %%e in ('dir /b /a-d *.txt') do (
(
for /f "tokens=1*delims=[]" %%b in ('find /v /n "" "%%e"') do (
echo %%b|findstr /x ""34 35 36 37 38 39 40 41 42 43 80 81 82 83 84 85 86 87 88 89">nul||echo %%c
)
)>"%%~ne-edit.txt"
)
再次注意,这是未经测试的
解释一下:
插入
setlocal
风味以确保执行批处理不会破坏环境是正常的。
执行
dir
命令以 *.txt
基本形式列出 /b
文件的目录(仅名称) /a-d
无目录名称。
这会在内存中构建一个文件名列表,每个文件名依次分配给
%%e
,因此源文件名位于%%e
中。 delims=
确保将整个文件名分配给%%e
,即使它包含像Space这样的分隔符。此外,此列表是在生成输出文件之前构建的,因此输出文件名不会包含在列表中(但如果使用type *.txt
,则会包含在列表中)对文件中的每一行进行编号
%%e
,并使用
%%b
标记为
%%c
和
[]
。
echo
%%b
中的行号到 findstr,如果没有完全匹配,则
echo
行内容。注意语法
(
for…(
…
)
)>"filename"
将收集第一个 (
和最后一个
)
之间的输出并创建一个新文件将文件名加引号以确保正确处理包含分隔符的文件名。
I prefer to avoid ADFNPSTXZ (in either case) as metavariables (loop-control variables)
ADFNPSTXZ are also metavariable-modifiers which can lead to difficult-to-find bugs
(See `for/f` from the prompt for documentation)