Replace all text before a string on a line

From NSIS Wiki
Jump to navigationJump to search
Author: Afrow UK (talk, contrib)


Description

This function was written for vbgunz. It searches a text file for a specified string, and once found replaces everything before it on that same line with another specified string.

Note: It will only find one occurrence of the string per line starting from the end of the line. It will also search the whole text file (not just once and stop) for occurrences of the specified string and do all replacements.

Usage

${ReplaceBefore} "Before" "With" "$INSTDIR\in.txt"

Example

$INSTDIR\Afrow.txt file content:

Hello my name is Afrow UK, or rather, Stuart.
Afrow UK is the dude!

Function Call

${ReplaceBefore} "Afrow UK" "Big " "$INSTDIR\Afrow.txt"

$INSTDIR\Afrow.txt new file content:

Big Afrow UK, or rather, Stuart.
Big Afrow UK is the dude!

The Function

!macro ReplaceBefore Before With In
Push "${Before}"
Push "${With}"
Push "${In}"
 Call ReplaceBefore
!macroend
!define ReplaceBefore "!insertmacro ReplaceBefore"
 
Function ReplaceBefore
 Exch $R0 ; file
 Exch
 Exch $R1 ; replace string
 Exch 2
 Exch $R2 ; find string
 Exch 2
 Push $R3 ; tmp file
 Push $R4 ; file handle
 Push $R5 ; tmp file handle
 Push $R6 ; line read
 Push $R7 ; loop char count
 Push $R8 ; input string len
 Push $R9 ; misc
 
 GetTempFileName $R3
 FileOpen $R4 $R0 r
 FileOpen $R5 $R3 w
 
  StrLen $R8 $R2
 
 Read:
  ClearErrors
  FileRead $R4 $R6
  IfErrors Done
 
  StrCpy $R7 0
 
 LineScan:
  IntOp $R7 $R7 - 1
  StrCpy $R9 $R6 $R8 $R7
  StrCmp $R9 "" Write
  StrCmp $R9 $R2 0 LineScan
 
   StrCpy $R6 $R6 "" $R7
   StrCpy $R6 $R1$R6
 
 Write:
  FileWrite $R5 $R6
  Goto Read
 
 Done:
 
 FileClose $R4
 FileClose $R5
 
 SetDetailsPrint none
 Delete $R0
 Rename $R3 $R0
 SetDetailsPrint both
 
 Pop $R9
 Pop $R8
 Pop $R7
 Pop $R6
 Pop $R5
 Pop $R4
 Pop $R3
 Pop $R2
 Pop $R1
 Pop $R0
FunctionEnd

-Stu