跳过标题行并在批处理脚本中替换文本文件中的字符串

时间:2014-10-06 18:07:14

标签: batch-file

@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:with {:20:。我已经写了并且已经取得了差不多...请尽量帮助我对这个全新的

1 个答案:

答案 0 :(得分:0)

@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 - 元变量%之前的f需要加倍。

more仪式不是必需的 - for /f有一个skip选项,可以跳过前n行。

所以 - 所需要的只是获取for...%%f...循环和每个文件生成的文件列表,处理每个单独的文件,跳过第一行。引用%%f中出现的文件名只是一个允许包含分隔符的文件名的安全措施,但这意味着需要调用usebackq来告诉for /f给出的列表不是文字字符串(它将假定为“引用字符串”,但是文件名。

然后,由于%%f%%i循环的上下文,因此您可以使用%%~nf选择目标文件名。我不确定您是想要~nf还是~nxf(添加第二个.txt扩展名),所以我选择单独使用~n。请注意,您对*的使用注定失败 - 这意味着“所有匹配的文件” - 可能不是您想要的,并且cmd会非常困惑。

我已经使用了一个已删除的del命令来删除目标文件 - 如果需要,只需删除rem,否则数据将附加到任何现有文件中。

我使用u:驱动器进行测试,并保留了我的源名称和目标名称。毫无疑问,您需要根据自己的系统进行更改。