I want to match multiple patterns in text files (in different directories) on the same line, copy the matched line to next line and modify the copied line. I want to duplicate every line that contains either the string "businessServices" or "BusinessServices". I don't care where the pattern to match appears in the line. I want to edit files in place. The desired added line are these global substitutions:
s#businessServices#userServices#g and s#validate#test#g
s#BusinessServices#UserServices#g
s#BUSINESS_SERVICES#USER_SERVICES#g
file1:
name="businessServices" value="validate"
file1 desired:
name="businessServices" value="validate"
name="userServices" value="test"
file2:
public static final String BUSINESS_SERVICES = "businessServices";
file2 desired:
public static final String BUSINESS_SERVICES = "businessServices";
public static final String USER_SERVICES = "userServices";
file3:
import com.my.ClientBusinessServicesRequest;
import com.my.ClientBusinessServicesResponse;
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
file3 desired:
import com.my.ClientBusinessServicesRequest;
import com.my.ClientBusinessServicesResponse;
import com.my.ClientUserServicesRequest;
import com.my.ClientUserServicesResponse;
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
ClientUserServicesRequest clientUserServicesRequest = new ClientUserServicesRequest();
ClientUserServicesResponse clientUserServicesResponse = new ClientUserServicesResponse();
file3 less desired (if file3 desired is too difficult to achieve):
import com.my.ClientBusinessServicesRequest;
import com.my.ClientUserServicesRequest;
import com.my.ClientBusinessServicesResponse;
import com.my.ClientUserServicesResponse;
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientUserServicesRequest clientUserServicesRequest = new ClientUserServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
ClientUserServicesResponse clientUserServicesResponse = new ClientUserServicesResponse();
I tried the following, each one get some desired results but not the entire desired results.
grep -rl businessServices . | xargs sed -i 's#\(.*\)validate\(.*\)#&\n\1test\2#'
grep -rl businessServices . | xargs sed -i 's#\(.*\)businessServices\(.*\)#&\n\1userServices\2#'
grep -rl BusinessServices . | xargs sed -i 's#\(.*\)BusinessServices\(.*\)#&\n\1UserServices\2#g'
grep -rli businessServices . | xargs sed -i 's#\(.*\)BUSINESS_SERVICES\(.*\)#&\n\1USER_SERVICES\2#'
I want to edit files in place
- if that's because you don't have enough disk space to use a temp file then please let us know because all Unix utilities (excepted
which uses an internal buffer) e.g. sed, awk, perl, ruby, etc. use a temp file behind the scenes to do what they refer to as "inplace" editing and so that would greatly complicate your problem. You can of course force some of those tools to read the whole file into memory ased
does and then write it out at the end but if your file is too massive to be copied on disk it may be too big to fit in memory too.cmd file > tmp && mv tmp file
is trivial using any command, the "inplace" editing stuff is just syntactic sugar as that's what they all do anyway. Yes, 1 input/output is easier for us to copy/paste to test with than 3 pairs of files BUT if you want to work with multiple input files it's good to include 2 (or 3) in your question so it's fine as-is. Regarding the 2 different "file3" outputs - if you need the "desired" one then don't include an undesirable version.