【问题标题】:Batch Script - Findstr "/n" flag?批处理脚本 - Findstr "/n" 标志?
【发布时间】:2018-07-19 17:58:52
【问题描述】:

我在网上找到了一个我想做的示例,即在文本文件中搜索字符串并仅替换该字符串并写入文件。哪种有效...

脚本确实替换了正确的文本。但是,它的打印行号,我不想要。但是,如果我从 findstr 中删除 \n 标志,它只会打印包含数据的行,以及不是 cmets *(即以“;;”开头的行) .

如何使用 findstr 打印没有行号的所有行?

@echo off &setlocal

set "search=string to replace"
set "replace=replace string with me"
set "textfile=input.ini"
set "newfile=output.ini"

(for /f "delims=" %%i in ('findstr /n "^" "%textfile%"') do (
    set "line=%%i"
    setlocal enabledelayedexpansion
    set "line=!line:%search%=%replace%!"
    echo(!line!
    endlocal
))>"%newfile%"
type "%newfile%"

【问题讨论】:

    标签: batch-file replace


    【解决方案1】:

    /n 开关需要保留空行,因此如果要将输入中的空行复制到输出,则不应从 findstr 中删除 /n 开关,否则您不需要 findstr 和可以直接用FOR读取文件。相反,您可以通过您的修改后的代码删除行号:

    @echo off
    setlocal
    
    set "search=string to replace"
    set "replace=replace string with me"
    set "textfile=input.ini"
    set "newfile=output.ini"
    
    (for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%textfile%"') do (
        if "%%j" NEQ "" (
            set "line=%%j"
            setlocal enabledelayedexpansion
            echo(!line:%search%=%replace%!
            endlocal
        ) else (
         echo(
        )
    ))>"%newfile%"
    type "%newfile%"
    

    也不需要set "line=!line:%search%=%replace%!",你可以直接将!line:%search%=%replace%!传递给echo

    或者您可以完全使用findstr,只需编写FOR 循环,如下所示,但您会丢失空行

    (for /f "usebackq delims="eol^= %%i in ("%textfile%") do (
        set "line=%%i"
        setlocal enabledelayedexpansion
        echo(!line:%search%=%replace%!
        endlocal
    ))>"%newfile%"
    

    请注意"usebackq delims="eol^=中的引号(")和eol之间不能有空格。这不是拼写错误。

    这是为了禁用默认的 eol 字符(;),以便FOR /F 命令不会忽略以分号(;) 开头的行

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多