仅在包含特定文本的行上批量查找和替换

Batch find and replace only on lines that contain a specific text

我正在尝试从批处理中“查找并替换”文本文件,但仅限于特定行,例如:

之前:

7,U7k956ykBJ,"GenericLine"
7,SwNZVX7SwPA2,"GenericLine"
7,783bMsWVSJZ8,"LineToReplace"
7,PiUcP84ujF5z,"GenericLine"

之后:

7,U7k956ykBJ,"GenericLine"
7,SwNZVX7SwPA2,"GenericLine"
2,783bMsWVSJZ8,"LineToReplace"
7,PiUcP84ujF5z,"GenericLine"

所以,为了更清楚,如果该行包含“LineToReplace”

,我想将“7”替换为“2”

在我看来,在 PowerShell 中执行此操作有点笨拙。

但是,对于批处理,这个脚本:

  1. 启用延迟变量扩展。
  2. 将 DestinationFile.txt 设置为 0 字节。
  3. 通过 FOR 循环遍历名为 SourceFile.TXT.
  4. 的文件的行
  5. 将每一行放在变量 Var 中。
  6. 用两个单引号替换 Var 中的任何双引号(以避免 IF 语句出现问题。)。
  7. 将 Var 中的搜索文本替换为空,将结果保存到 Alt。
  8. 如果 Alt 不等于 Var,则 Var 具有所需的文本,在 Var 中获取该行的全新未更改副本,回显数字 2,然后是除第一个字符之外的所有 Var。
  9. Else Var 没有所需的文本,因此按原样回显该行。
  10. 将输出发送到 DestinationFile.txt
@ECHO OFF
SetLocal EnableExtensions EnableDelayedExpansion

NUL >DestinationFile.txt 2>NUL
FOR /F "EOL=~ TOKENS=* DELIMS=~" %%L IN (SourceFile.txt) DO (
    SET Var=%%L
    SET Var=!Var:"=''!
    SET Alt=!Var:LineToReplace=!
    IF NOT "!ALT!" == "!Var!" (
        SET Var=%%L
        ECHO;2!Var:~1!
    ) ELSE (
        ECHO;%%L
    )
) >>DestinationFile.txt