I need to do a find/replace in multiple files but I want to keep the first occurrence of the match and replace all others. THis may have been answered else where but it's a bit difficult to search for.
I am currently using: perl -pi -w -e 's/THING/SOMETHING_ELSE/g;' ./src/**/*.py
A practical example:
from stuff import THING
print(f"use {THING} here")
print(f"use {THING} there")
print(f"use {THING} everywhere")
Should become:
from stuff import THING
print(f"use {SOMETHING_ELSE} here")
print(f"use {SOMETHING_ELSE} there")
print(f"use {SOMETHING_ELSE} everywhere")
CodePudding user response:
You'll have to check for /THING/
before doing the s/THING/.../
.
Here's how would be as a script thing-to-other
that you can then call as thing-to-other ./src/**/*.py
#!/bin/env perl -i -p
if ( /THING/ ) {
if ( $seen{$ARGV} ) {
s/THING/SOMETHING_ELSE/g;
}
}
Note that I got rid of the -w
because the use of the %seen
hash will throw a warning. The %seen
hash keeps track how many times in each input file ($ARGV
) you've seen /MATCH/
.
If you really need it to be a one-liner:
perl -i -p -e'if (/THING/) {if($seen{$ARGV} ){s/THING/SOMETHING_ELSE/g}}'