Batch file 使用批处理文件替换文本文件中每行中的特定文本

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

我有一个文本文件,我想使用批处理脚本删除每行中直到第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   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