![](/img/trans.png)
[英]batch script, find string in text file by line then replace whole line with another string
[英]skip header line and replace string in text file in batch script
@echo off
setlocal enableextensions disabledelayedexpansion
for /r %f in (xis_a*) do More +1 %~nxf >> No_header_%~nxf
set "search=:20:"
set "replace={:20:"
for /f "delims=" %%i in ('type (No_header_*.txt) ^& break ^> (No_header_*.txt) ') do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
>>No_header_*.txt echo(!line!
endlocal
)
正在尝试跳过文本文件中的标题行,并用{:20:替换:20:。 我已经写过并且几乎取得了成就..请尝试帮助我这个新手
@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "destdir=U:\destdir"
set "search=:20:"
set "replace={:20:"
for /r "%sourcedir%" %%f in (xis_a*) do (
REM DEL "%destdir%\No_header_%%~nf.txt" >NUL 2>nul
for /f "usebackqskip=1delims=" %%i in ("%%f") do (
set "line=%%i"
setlocal enabledelayedexpansion
set "line=!line:%search%=%replace%!"
>>"%destdir%\No_header_%%~nf.txt" echo(!line!
ENDLOCAL
)
)
GOTO :EOF
这应该可以解决问题。
在您的代码中,初始setlocal
建立了默认条件,因此我省略了它。
你必须%f
在你的'for /r
-的%
的metavariable前f
需要加倍。
不需要more
仪式- for /f
有一个skip
选项,将允许skip
前n行。
因此-所需要做的就是获取由for...%%f...
循环生成的文件列表,并与每个文件一起处理每个文件,跳过第一行。 引用出现在%%f
的文件名只是一种安全措施,允许包含分隔符的文件名,但这意味着需要调用usebackq
来告诉for /f
给出的列表不是文字字符串(它将假定为(带引号的字符串)),但文件名。
然后,由于%%f
是%%i
循环的上下文,因此可以使用%%~nf
选择目标文件名。 我不知道你是否希望~nf
或~nxf
(添加第二个.txt
扩展名),所以我选择使用~n
孤独。 请注意,您对*
的使用注定会失败-这意味着“所有文件都匹配”-可能与您想要的不完全相同, cmd
会变得非常混乱。
我已经添加了一个remmed-out del
命令,以允许删除目标文件-如果需要,只需删除rem
,否则数据将被附加到任何现有文件中。
我使用u:
驱动器进行测试,并保留了源名称和目标名称。 毫无疑问,您将需要更改它们以适合您的系统。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.