使用批处理文件修改文件内容

3

我需要创建一个批处理文件,用它来修改文件的内容。

举个例子:

Testing.txt 文件包含一行 Description=MAN_Human 更改为 Description=MAN_Human_V2

只需在 MAN 的末尾添加 (_V2)。

这样当我们打开文件时,描述名称就变成了 MAN_Human_V2 而不是仅仅是 MAN。

我有多个文件需要处理,请帮忙。


没有一个确切的答案能够回答这个问题。我们可以告诉你如何在文件或行末添加文本,或者如何解析文本并查找特定标记以替换为新的文本... 但只要你不明确具体的标准,这个问题就无法得到正确的回答。 - GolezTrol
嗨..只需要在描述名称后面添加_V2 Description=MAN_Human 更改为 Description=MAN_Human_V2请帮忙处理批处理文件。 - Sumit
如有任何问题,请告知。 - Sumit
这就是为什么我要求您定义规则的原因。一个例子并不能让我们回答这个问题。如果您无法明确问题的范围,我们无法提供帮助。 - GolezTrol
这并不是一个不同的问题——它是你已经发布的其他两个问题的下一步。最好修改原始问题并添加更多细节,以便所有信息都在一个线程中。听起来你有1000个文件,每个文件中都有“Description=???”。有时,“Description”不是唯一的,因此将文件重命名为描述并不总是有效...因此,您需要编辑TXT文件并更改描述以使其唯一,以便重命名将起作用。这是未明确说明的需求吗? - James L.
显示剩余7条评论
2个回答

4

使用for循环遍历文件的每一行,当您找到带有“描述”的行时,将“_V2”附加到输出中。

@echo off

for %%f in (*.txt) do (
  for /f "tokens=1* delims=:" %%g in ('type "%%f" ^| findstr /n /v "BoGuSsTrInG"') do (
    if "%%hx"=="x" (
      echo.>>"%%~nf.newtxt"
    ) else (
      for /f "tokens=1* delims==" %%i in ('echo.%%h') do (
        if "%%i"=="Description" (
          echo.%%i=%%j_V2>>"%%~nf.newtxt"
        ) else (
          if "%%jx"=="x" (
            echo.%%i>>"%%~nf.newtxt"
          ) else (
            echo.%%i=%%j>>"%%~nf.newtxt"
          )
        )
      )
    )
  )
)

ren *.txt *.oldtxt
ren *.newtxt *.txt

当您处理test.txt文件时,当然必须将内容输出到新文件中。然后再用新创建的文件替换原始文件...

编辑 #1

在将任何一个TXT文件重命名回其原始名称之前,您必须完全复制TXT文件的内容到新文件中。这是因为如果立即对它们进行重命名,for循环会在修改后再次捕获它们,其中一些将多次添加_V2。
我没有在最后删除.oldtxt文件,因为在确定进程正常工作之前,您不应该销毁原始文件!

编辑 #2

有一个解决方法可以保留空行。解决方法是将文本文件的内容传输到findstr,查找不包含BoGuSsTrInG的所有行。输出包括行号(获取打印空行的唯一方法)。行号有尾随冒号(:),因此我们可以在冒号上将输出分成不同的变量。tokens = 1 *将行号分割为%%g变量,并且结果行在%%h变量中。我们可以测试%%h以查看它是否为空并向新文件添加空行。否则,我们像以前一样处理%%h。

请注意 - 如果您给有帮助的答案点赞,并将回答您问题的答案标记为“正确”,那么人们在未来会更愿意帮助您。 - James L.
但是我不想更改文件名。 - Sumit
没有批处理文件的方法可以更改文件内容。但是,您可以逐行分析文件,并将每行发送到新文件(在到达所需行时修改所需行)。然后,一旦创建了修改后的文件,就可以用修改后的文件替换原始文件。这就是上面的代码所做的... - James L.
我理解并且单个文件的情况下它可以正常工作,但问题是我不想要一个单独的文件,也不想改变实际文件名。那么多个文件怎么办?请给予建议并帮助我。 - Sumit
请查看此链接中的最后一篇帖子(http://www.computing.net/answers/programming/for-loop-to-read-blank-lines-from-file/20635.html),以了解有人如何使`for`命令**不**跳过空行。--恐怕我不理解你的最后一个问题(关于指针未向前移动)。 - James L.
显示剩余6条评论

1
你可以下载 sed(一个Unix实用程序 - 在谷歌上搜索 sed windows)。
sed -i 's/Description=MAN_Human/Description=MAN_Human_V2/' test.txt

-i 的意思是原地替换,即将结果写回同一文件(而不是显示在屏幕上)。第二个参数表示替换...为...,其余部分是要执行此操作的一个或多个文件。请搜索 man sed 以获取更多信息。


实际上,这可以只使用批处理文件完成。请参见我的答案。 - James L.
感谢您的支持-已删除仅使用批处理文件无法实现的行。 - AMADANON Inc.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接