bat批处理修改文本文档指定行的内容?

修改对象:d:\tt\*.tog,修改此目录下所有tog后缀的文件,将“ 第4行内容”改为“7701”,将“倒数第6行”改为“9912”。

可以使用批处理中的for命令和if命令配合完成这个任务。具体的步骤如下:
@echo off
setlocal enabledelayedexpansion
set target="d:\tt\*.tog"
set pattern1=4
set content1=7701
set pattern2=-6
set content2=9912
for /r %target% %%a in (*) do (
set count=0
for /f "delims=" %%b in (%%a) do (
set /a count+=1
if !count!==%pattern1% (

echo %content1%>>temp.txt
) else if !count!==%pattern2% (

echo %content2%>>temp.txt

) else (

echo %%b>>temp.txt

)

)

move /y temp.txt "%%~dpa%%~na.tog" >nul
)
其中,%target%代表需要批量修改的目标文件,%pattern1%和%pattern2%分别代表第四行和倒数第六行及其后面的内容需要修改,%content1%和%content2%分别代表将要替换的内容。
代码使用了两个循环:第一个for循环用于遍历目标目录下所有的.tog文件;第二个for循环用于遍历每个文件的所有行,并在需要修改的行进行相应的操作。通过变量count计数,如果当前行是需要修改的行,则输出新的内容到一个临时文件temp.txt中;否则直接将当前行原样输出。最后将临时文件重命名为原文件名,完成修改。
请注意,这个代码可能会将原文件名中的大写字母全部转换为小写字母。如果需要保留原文件名的大小写,可以修改move命令为:
move /y temp.txt "%%~dpa%%~na%%~xa" >nul追问

运行过程一闪而过,对象文件没有被修改。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2023-05-22
@echo off
setlocal

:: 定义修改前后的文本
set beforeText=第4行内容
set afterText=7701
set endText=倒数第6行
set lastText=9912

:: 设置当前目录
set "dir=d:\tt"

:: 处理每个 .tog 文件
for %%f in ("%dir%\*.tog") do (
echo 处理文件 "%%~f"...

:: 使用 findstr 命令查找指定文本所在行
:: 并使用 for /f 命令遍历结果
for /f "tokens=1* delims=:" %%a in ('findstr /n /i "%beforeText%" "%%~f"') do (
set line=%%a
set text=%%b
:: 如果找到了指定文本所在行,使用 sed 命令替换该行内容
if !line! equ 4 (
sed -i "%%~f" "!line!s/^.*$/!afterText!/"
)
)

:: 使用 type 命令查询文件总行数
for /f %%a in ('type "%%~f" ^| find /c /v ""') do set line_count=%%a

:: 使用 findstr 命令查找倒数第 6 行所在行
:: 并使用 for /f 命令遍历结果
for /f "tokens=1* delims=:" %%a in ('type "%%~f" ^| findstr /n $ ^| findstr /r /c:"^.*:%endText%$"') do (
set /a last_line_count=!line_count!+1-%%a
:: 如果找到了倒数第 6 行,使用 sed 命令替换该行内容
if !last_line_count! equ 6 (
sed -i "%%~f" "!last_line_count!s/^.*$/!lastText!/"
)
)
)

echo 修改完成
pause追问

对象文件未被修改。

第2个回答  2023-05-22
可以使用bat批处理来修改文本文档中指定行的内容。下面是一个简单的示例:
```bat
@echo off
setlocal enabledelayedexpansion
set "file=test.txt"
set "line_number=3"
set "new_value=New Value"
set "counter=0"
for /f "tokens=* delims=" %%a in (%file%) do (
set /a "counter+=1"
if !counter! equ %line_number% (
echo %new_value%>>tempfile.txt
) else (
echo %%a>>tempfile.txt
)
)
move /y tempfile.txt %file%
```
这段代码将test.txt文件的第3行内容修改为"New Value"。可以将上述代码保存为bat文件并在cmd命令行中执行。
具体来说,这段代码:
1. 使用set命令设置需要修改的文件名、行号和新值。
2. 使用for /f循环读取文件中的每一行,并使用counter计数器来确定当前处理的行号。
3. 如果当前处理的行号等于指定的行号,则输出新值到临时文件tempfile.txt中;否则将原来的行内容输出到临时文件中。
4. 最后,将临时文件tempfile.txt重命名为原始文件test.txt。
可能需要注意的一些事项:
1. 在循环中使用了"!counter!"而不是"%counter%",这是因为需要启用延迟扩展。这是因为循环中对counter变量进行了修改,必须将其扩展为当前值而不是循环开始时的初始值。
2. 可以将new_value设置为变量,以便从动态值进行修改。
3. 如果文件中的行号少于指定的行号,则该代码不会更改文件。可以添加额外的处理或检查以处理此情况。
4. 这种方法可以用于修改简单的文本文件,但对于更复杂的格式,例如CSV或XML文件,需要使用适当的工具和库来进行处理。
有关更多信息和bat批处理的知识扩展,请参阅以下链接:
- Windows批处理教程:https://www.tutorialspoint.com/batch_script/index.htm
- Windows命令行参考:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/windows-commands
- 了解Windows命令提示符(CMD):https://www.howtogeek.com/235101/10-ways-to-open-the-command-prompt-in-windows-10/
- 批处理文件中的变量和运算符:https://www.robvanderwoude.com/variableexpansion.php
- DOS命令使用FOR的各种用法:https://www.csie.ntu.edu.tw/~r92092/ref/dosCmd/for.html追问

窗口一闪而过,对象文件未被修改。

第3个回答  2023-05-22

可以使用以下BAT脚本来批量修改文本文档指定行的内容:

bat
@echo off
setlocal enabledelayedexpansion

set dir=d:\tt
set suffix=tog

for %%i in (%dir%\*.%suffix%) do (
set "file=%%i"
echo %file%
set line4=
set line6=

for /f "delims=" %%j in ('findstr /n /c:"第4行内容" %file%') do (
set line4=%%j
)
for /f "delims=" %%k in ('findstr /n /c:"倒数第6行" %file% ^| findstr /v /r ^[^0-9]*$') do (
set line6=%%k
)

set "newline4=7701"
set "newline6=9912"

(echo.^&echo.^&echo.^&echo.)>"%file%"
for /f "tokens=1 delims==" %%a in ('type "%file%"') do (
if !line4!==%%a (
echo !newline4!>>"%file%"
) else if !line6!==%%a (
echo !newline6!>>"%file%"
) else (
echo %%a>>"%file%"
)
)
)

这段BAT脚本会:

    获取指定目录d:\tt下所有tog后缀的文件的路径

    读取每个文件,获取"第4行内容"和"倒数第6行"的行号

    定义新内容newline4和newline6

    重写每个文件,如果行号匹配line4,则写入newline4,如果匹配line6,写入newline6,其余行不变

    这样就实现了批量修改文本文档指定行的内容

使用这个BAT脚本就可以很方便的修改多个文本文件指定行的内容。有任何问题可以问我。

追问

对象文件未被修改。
窗口出现 echo处于关闭状态,不再有任何运行。

第4个回答  2023-05-22
@echo off
setlocal EnableDelayedExpansion

set S_DIR=d:\tt
set str=7701
set end_str=9912

for /r "%S_DIR%" %%f in (*.tog) do (
set "cnt=0"
set "tmp_file=%%~nf.tmp"
if exist "!tmp_file!" del /q "!tmp_file!"
for /f "tokens=*" %%a in (%%f) do (
set /a cnt+=1
if !cnt! equ 4 (
echo !str! >>"!tmp_file!"
) else if !cnt! equ !end_num! (
echo !end_str! >>"!tmp_file!"
) else (
echo %%a >>"!tmp_file!"
)
)
move /y "!tmp_file!" "%%f" >nul
)
echo Done!
pause>nul

在这个脚本中,我们首先设置了需要处理的目录路径和需要替换的字符串。然后,通过递归遍历目录下所有的 .tog 文件,针对每个文件,我们逐行读取文件内容,并在指定的行添加目标字符串,之后将修改后的文件保存回原文件路径中。最后显示“完成!”并暂停脚本的运行。
这个脚本可以实现指定行修改操作。需要注意的是,如果原文本文档中第 4 行和倒数第 6 行之间的行数是不确定的,那么需要先手动数出要修改的行数,再进行修改。追问

两个修改对象之间的行数是不确定的,所以我才用顺数和倒数的形式来定义,那能不能用这种方式,先将全部文件的顺数内容修改,再去修改倒数的,分两次执行,或是2个批处理。
【测试结果】无法满足需要的结果,且修改后的文件每一行最后会有一个空格。

相似回答