【问题标题】:Batch find and replace only on lines that contain a specific text [closed]仅在包含特定文本的行上批量查找和替换 [关闭]
【发布时间】:2022-07-17 00:53:46
【问题描述】:

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

之前:

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”

【问题讨论】:

    标签: batch-file replace


    【解决方案1】:

    在我看来,批处理有点笨拙 - 考虑一下 PowerShell。

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

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

    编辑: 正如我所说,在我看来,批处理有点笨重。事实证明,如果源文件的文本中有感叹号!,则我提交的解决方案无法正常工作。虽然我确信这个问题可以通过真正的批处理脚本来解决,但我认为是时候考虑替代方案了。

    这是一个 Batch/PowerShell 混合版本:

    @ECHO OFF
    PowerShell -NoProfile -ExecutionPolicy RemoteSigned -Command "switch -Regex -File 'SourceFile.txt' { '^.+?(?<RestOfLine>,.*LineToReplace.*)$' {'2'+$Matches.RestOfLine} default {$_}}" >"DestinationFile.txt"
    

    【讨论】:

    • 它确实有效,但我只是过了一会儿才注意到,如果有一个“!”,它的行为很奇怪。 (奇怪,因为它只是忽略以下字符,直到引用)
    • 澄清一下,你的意思是如果 SourceFile.txt 有一个!,那么它会忽略所有字符,直到下一个"?如果这就是你的意思,那么听起来它需要重新设计才能正确处理!。让我知道是否是这种情况。
    • 是的,情况就是这样
    猜你喜欢
    • 1970-01-01
    • 2012-05-13
    • 1970-01-01
    • 2014-06-04
    • 2022-11-10
    • 2022-01-24
    • 2021-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多