如何从文件中删除某些行号并使用输入文件名批量保存文件

问题描述 投票:0回答:1

我正在尝试通过删除某些行号来编辑 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

有人可以帮助我吗?

谢谢!

batch-file cmd find txt
1个回答
0
投票

您的代码的作用是:
连接每个

.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)
    
© www.soinside.com 2019 - 2024. All rights reserved.