-
So I cracked open Eclipse to make the REGEX search and replace. The expression I came up with was:
#Search RegEx # This looks for .jpg, and then does a # NON-Consuming match on a word boundary where there is NOT a ? # For example .jpg" and .jpg' would match, but .jpg?version2 will not \.jpg(?\b)(?[^\?]) #Replacement \.jpg?STATIC_CONTENT_VERSION
I proceeded to do the simple search and replace.
To my chagrin, I received the infamous Error:
, "Match string has changed in the file"
Why is this? Well I googled it. It is a know bug with Eclipse and regexes...
Eclipse Bug.
Workaround: well we could use Netbeans, but I choose to go more primitive and use perl. This post will include the generic perl script developed to solve the simple issue and how it was used:
To use, simple type perl findreplace.pl regexSearch regexReplace [0|1]
The 0 is a dryrun, the 1 will really do the replace.
use File::Find; use File::Basename; # The inputs: # directory to start in, findRegex, replacement, dryrun indicator @DIRS = $ARGV[0]; $patternFind = $ARGV[1]; $patternReplace = $ARGV[2]; $dryrun = $ARGV[3]; # process a single file (this sub is called from below) sub processFile{ $baseN=""; $dirN=""; $extN=""; $linesProcessed = 0; $currentFile = $File::Find::name; ($baseN,$dirN,$extN) = fileparse($currentFile,'\..*'); if ($extN eq ".java" || $extN eq ".jsp" || $extN eq ".properties" || $extN eq ".js" || $extN eq ".css" ){ # This represents a file that we want to do a search and replace on. # print "found java $currentFile :$extN:$baseN:$dirN:\n"; }else{ # print "\nRETURNING: $currentFile\n\n"; return; } $currentBaseName = $_; # OPEN THE FILE READ ONLY. open FILE, $currentBaseName; $modify= 0; # DETERMINE IF THE FILE CONTAINS A MATCH while($line =){ if($line =~ /$patternFind/){ $modify++ } } close FILE; if($modify==0){ # THERE WAS NO REGEX MATCH, SO EXIT. return; } # NO IT's not the evil number, # it means set to global read/write in unix. # required for TFS integration. chmod 0666, $currentBaseName; open (FILE, "+< $currentBaseName") or die "can't read $currentFile $!"; $out = ''; while( ){ if($_ =~ /$patternFind/){ $linesProcessed++; print "\tReplace: $_\n"; s/$patternFind/$patternReplace/eg; print "\tWith: $_\n"; } $out .=$_; } if($dryrun==1){ seek(FILE,0,0) or die "can't seek to start of $currentFile $!"; print FILE $out or die "cant't print $currentFile $!"; truncate(FILE, tell(FILE)) or die "can't truncate $currentFile: $!"; close (FILE) or die "can't close $currentFile: $!"; } print "File:$baseN$extN :From ->:$dirN\n"; print "Lines Changed: $linesProcessed\n"; print "___________________________________________________\n"; } find (\&processFile, @DIRS);
hope you find this useful!