Batch file 使用批处理文件替换文本文件中每行中的特定文本
我有一个文本文件,我想使用批处理脚本删除每行中直到第19行的所有结尾0 我已经写了一个代码来查找特定的行。不知道如何前进 我想修改文本文件,每行不以0结尾 novamth.txt文件Batch file 使用批处理文件替换文本文件中每行中的特定文本,batch-file,replace,cmd,Batch File,Replace,Cmd,我有一个文本文件,我想使用批处理脚本删除每行中直到第19行的所有结尾0 我已经写了一个代码来查找特定的行。不知道如何前进 我想修改文本文件,每行不以0结尾 novamth.txt文件 ATC4 C 5 0 CTY C 3 0 CTY_DESCR C 21 0 E_DT_PRTEXP C 43 0 E_YR_PRTEXP C 41 0 GEN_PRD C
ATC4 C 5 0
CTY C 3 0
CTY_DESCR C 21 0
E_DT_PRTEXP C 43 0
E_YR_PRTEXP C 41 0
GEN_PRD C 28 0
LNCH_STATUS C 22 0
MNF C 18 0
NAME_TYPE C 22 0
NFC123 C 3 0
PRD C 18 0
PRE_PST_EXP C 28 0
PROT_ECTION C 24 0
REL_PROT_EXP_MTH C 40 0
REL_PROT_EXP_YR C 31 0
STR C 6 0
INTSTR C 52 0
PCK C 31 0
INTPCK C 72 0
KG MTH_04_2017 N 35 15
KG MTH_05_2017 N 35 15
KG MTH_06_2017 N 35 15
KG MTH_07_2017 N 35 15
KG MTH_08_2017 N 35 15
bat文件以查找特定行
@echo off & setlocal EnableDelayedExpansion
set LineNumber=19
set FileName=C:\PADDS\bat\nova\novamth.txt
set counter=0
for /F "delims=" %%j in ('type "%FileName%"') do (
set /A counter+=1
if !counter! equ %LineNumber% (echo.%%j> "myline.txt" & goto :END)
)
:END
根据您的需要,您有一些选择,但是,让我们只解决您已经列出的基本问题,因为您几乎已经有了一个工作版本 我将用“这样我们就不会有任何错误的角色”来包装你们的场景
@(
SetLocal EnableDelayedExpansion
Echo off
)
set "LineNumber=19"
set "FileName=C:\PADDS\bat\nova\novamth.txt"
set "counter=1"
For /F "tokens=*" %%j in ('type "%FileName%"') do (
Set /A "counter+=1"
Set "_Line=%%j"
IF /I !counter! leq %LineNumber% (
Set "_Line=!_Line:~0,-1!"
)
echo(!_Line!>> "myline.txt"
)
:END
(
EndLocal
Exit /B
)
我将该行存储在一个临时变量\u line
中,并从该字符串中删除最后一个字符,因为您似乎没有任何尾随空格。这是最简单的方法。
这种变化只发生在前19行,之后我们就照原样写了
>
用于附加到文件中,因为每次写入一行时,
都会覆盖写入
在上面的版本中,它将用于提供的数据,这将删除所有0。如果0可能出现在行的最后一位以外的位置,则可以更改这一点。我在淋浴时在mobile上写这篇文章,并认为我已编辑以包含该信息,但它不在那里,因此现在这应该有帮助:)
在任何情况下,如果您确实有可以包含0的数据,那么我们是否可以至少假设始终存在4个术语
还有,有没有尾随空格,看起来没有,所以我假设是这样的
是否需要保留所有空格?(我假设是)甚至是最后0之前的空格?(我现在假设是,但您将看到,删除它们很容易)
我将在下一次迭代中假设上述答案
我进一步修改了此内容,以提供创建文件的明确输出,供作者查看,因为作者无法找到该文件。
在添加作者要编辑的path变量时,我也稍微更改了变量
此外,我还决定将其添加到输出文件的删除中,以防该文件已经存在,尽管没有明确要求,以防作者之前已经运行过
REM Script: %~f0
REM Version: 1.0.0
@(
SetLocal EnableDelayedExpansion
Echo off
)
SET "_LineNumber=19"
SET "_SourceFileName=C:\PADDS\bat\nova\novamth.txt"
SET "_OutputFileName=C:\PADDS\bat\nova\myline.txt"
SET "_Counter=1"
DEL /F /Q "%_OutputFileName%"
For /F "tokens=*" %%j in ('type "%_SourceFileName%"') do (
SET /A "_Counter+=1"
SET "_Line=%%j"
IF /I !_Counter! leq %_LineNumber% (
FOR /F "Tokens=1-3 Delims=ABCDEFGHIJKLMNOPQRSTUVWXYZ_012345678910" %%J IN ("%%j") DO @(
SET "_Space_1=%%J"
SET "_Space_2=%%K"
SET "_Space_3=%%L"
)
FOR /F "Tokens=1-3 Delims= " %%J IN ("%%j") DO @(
SET "_Line=%%J!_Space_1!%%K!_Space_2!%%L!_Space_3!"
)
)
echo(!_Line!>>"%_OutputFileName%"
)
(
ECHO. Check the File "%_OutputFileName%"
EndLocal
Exit /B
)
在上面,我现在开始取整行,如果计数小于或等于19,我们可以很容易地使用第二个循环来获得一组空格,方法是使用我们期望的所有非空格字符作为分隔符,而不是空格
这允许我们将每个术语之间的所有空格捕获到一些变量中
下面的For循环获取术语本身,并重新使用For循环变量,因为它们一旦离开前一个循环就会被销毁
在这里,我们不需要分配除_Line变量之外的任何变量,因为我们已经收集了所有需要的信息。因此,我们使用保存数据的术语,并将它们与前一步中发现的空格变量分隔开
一旦我们构造了新行变量,我们就可以使用If语句了,现在就不需要有单独的ECHO语句了(老实说,即使在第一个语句中也没有,但我在手机上写得很快,不缩短它似乎更容易
(我已经修改了原稿,使其没有单独的回声,我总是尽可能地选择,因为我觉得它更干净。)
我已经修改了它,在一个可以编辑的变量中为您的文件提供了一个特定的输出路径,并在CMD行中提供了该路径
在CLI上运行CMD脚本的示例:
Y:\>C:\PADDS\bat\nova\testnovamth.cmd
Y:\>REM Script: C:\PADDS\bat\nova\testnovamth.cmd
Y:\>REM Version: 1.0.0
Check the File "C:\PADDS\bat\nova\myline.txt"
Y:\>
ATC4 C 5
CTY C 3
CTY_DESCR C 21
E_DT_PRTEXP C 43
E_YR_PRTEXP C 41
GEN_PRD C 28
LNCH_STATUS C 22
MNF C 18
NAME_TYPE C 22
NFC123 C 3
PRD C 18
PRE_PST_EXP C 28
PROT_ECTION C 24
REL_PROT_EXP_MTH C 40
REL_PROT_EXP_YR C 31
STR C 6
INTSTR C 52
PCK C 31
INTPCK C 72 0
KG MTH_04_2017 N 35 15
KG MTH_05_2017 N 35 15
KG MTH_06_2017 N 35 15
KG MTH_07_2017 N 35 15
KG MTH_08_2017 N 35 15
脚本输出示例:
Y:\>C:\PADDS\bat\nova\testnovamth.cmd
Y:\>REM Script: C:\PADDS\bat\nova\testnovamth.cmd
Y:\>REM Version: 1.0.0
Check the File "C:\PADDS\bat\nova\myline.txt"
Y:\>
ATC4 C 5
CTY C 3
CTY_DESCR C 21
E_DT_PRTEXP C 43
E_YR_PRTEXP C 41
GEN_PRD C 28
LNCH_STATUS C 22
MNF C 18
NAME_TYPE C 22
NFC123 C 3
PRD C 18
PRE_PST_EXP C 28
PROT_ECTION C 24
REL_PROT_EXP_MTH C 40
REL_PROT_EXP_YR C 31
STR C 6
INTSTR C 52
PCK C 31
INTPCK C 72 0
KG MTH_04_2017 N 35 15
KG MTH_05_2017 N 35 15
KG MTH_06_2017 N 35 15
KG MTH_07_2017 N 35 15
KG MTH_08_2017 N 35 15
本网站不提供免费的脚本咨询或编写服务。您能否描述一下,您编写和发布的批处理文件在针对您提供内容的文本文件运行时,如何无法执行您描述的任务。您是希望始终使用行
19
而不考虑行内容,还是始终使用设置以INTPCK开头或包含INTPCK
的行?请阅读以下帮助文章:和!使用:调用jrepl“0$”/inc“1:19”/f“file.txt"/o-
对不起,但是!\u Line:0=!
删除每一个零,而不仅仅是最后的一个。是的,我在手机上写了这篇文章,并打算在帖子中包含这些信息,同时附上一条说明,一旦我不使用手机,我会制作一个更好的版本,除非没有这样的情况,因为这对提供的信息有效。然而,我想这篇文章没有发表,我当时正在匆忙地打字,虽然我不得不冲出淋浴让孩子们为日托做好准备,但我猜最后一次编辑没有发表。我发现在手机上写这篇文章有点难。谢谢大家提醒@Stephan!:)你的第二种方法看起来好多了,甚至还保留了中间的空白(无论是空格、制表符还是混合)。我在两个中都为“%%j”中的…添加了一些引号…
将它们作为字符串而不是文件名进行处理,从而使您的脚本实际工作。感谢您修复了我这方面的一个小错误,当您无法测试时,简单的错误会由于ot人为错误而发生。不确定“看起来更好”是什么意思这两种方法都是有效的,如果第二种方法在另一个文本中没有0,那么第二种方法就是过度杀戮。这是我必须了解的,第二种答案通常是过度杀戮,堆栈管理员通常不喜欢你做超出我经验中所需的最低限度的事情。嗯,dat中有REL_PROT_EXP_MTH C 40 0
例如,第一种方法肯定会做出不必要的更改(40
->4
)