Question

I am writing a batch script which I wish to open a file and then change the second line of it. I want to find the string "cat" and replace it with a value that I have SET i.e. %var% . I only want this to happen on the second line (or for the first 3 times). How would you go about doing this?

Was it helpful?

Solution

I just solve it myself. It will lookup var on line two only.

@echo OFF
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
SET filename=%1
set LINENO=0    
for /F "delims=" %%l in (%filename%) do (
 SET /A LINENO=!LINENO!+1
 IF "!LINENO!"=="2" ( call echo %%l ) ELSE ( echo %%l )
)

But I prefer using cscript (vbscript or even jscript).

OTHER TIPS

First of all, using a batch file to achieve this, is messy (IMHO). You will have to use an external tool anyway to do the string replacement. I'd use some scripting language instead.

If you really want to use a batch, this will get you started.

This would be ugly to do with native batch scripting. I would either

  1. Do this in VBScript. If you really need this in a batch file, you can call the VBScript file from the batch script. You can even pass in %var% as an argument to the VBScript.

  2. Use a sed script. There are windows ports of Unix commands like GnuWin32, GNU Utilities for Win32 (I use these), or Cygwin.

I would create a script that would:

  1. scan the input file
  2. write to a second output file
  3. delete the input
  4. rename the output

As far as the dos commands to parse, I did a Google Search and came up with a good starting point:

@echo off
setlocal enabledelayedexpansion

set file=c:\file.txt
set output=output.txt
set maxlines=5000

set count=0

for /F "tokens=* usebackq" %%G in ("%file%") do (
 if !count!==%maxlines% goto :eof

 set line=%%G
 set line=!line:*000000000000=--FOUND--!
 if "!line:~0,9!"=="--FOUND--" (
  echo %%G>>"%output%"
  set /a count+=1
 )
)

(Stolen from teh Intarwebnet)

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top