I want to match multiple patterns in text files on the same line, copy and modify the matched 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 insert the copied lines at the end of each section (pattern). e.g. The string "import ... ;" indicated one section. i.e ";" indicated the end of that section. The string "{ ... }" indicated another section. i.e "}" indicated the end of that section. I want to edit files in place. The desired added line are these global substitutions:
s#businessServices#userServices#g
s#BusinessServices#UserServices#g
in:
import com.my.ClientBusinessServicesRequest;
import com.my.ClientBusinessServicesResponse;
import com.my.ClientOtherServicesRequest;
import com.my.ClientOtherServicesResponse;
ClientBusinessServicesResponse callClientBusinessServices(String businessServicesRequestKey) {
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
clientBusinessServicesRequest.setKey(businessServicesRequestKey);
clientBusinessServicesResponse = callClientBusinessServicesInternal(clientBusinessServicesRequest);
return clientBusinessServicesResponse;
}
ClientOtherServicesResponse callClientOtherServices(String otherServicesRequestKey) {
}
Desired:
import com.my.ClientBusinessServicesRequest;
import com.my.ClientBusinessServicesResponse;
import com.my.ClientOtherServicesRequest;
import com.my.ClientOtherServicesResponse;
import com.my.ClientUserServicesRequest;
import com.my.ClientUserServicesResponse;
ClientBusinessServicesResponse callClientBusinessServices(String businessServicesRequestKey) {
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
clientBusinessServicesRequest.setKey(businessServicesRequestKey);
clientBusinessServicesResponse = callClientBusinessServicesInternal(clientBusinessServicesRequest);
return clientBusinessServicesResponse;
}
ClientOtherServicesResponse callClientOtherServices(String otherServicesRequestKey) {
}
ClientUserServicesResponse callClientUserServices(String userServicesRequestKey) {
ClientUserServicesRequest clientUserServicesRequest = new ClientUserServicesRequest();
ClientUserServicesResponse clientUserServicesResponse = new ClientUserServicesResponse();
clientUserServicesRequest.setKey(userServicesRequestKey);
clientUserServicesResponse = callClientUserServicesInternal(clientUserServicesRequest);
return clientUserServicesResponse;
}
I tried the following awk script. The result is very close, except some line breaks disappear. How to preserve the line breaks in the input file?
awk -i inplace '
/import.*;/ {
origimportbuf = origimportbuf $0 ORS
}
/import.*usinessServices.*;/ {
importbuf = importbuf $0 ORS
}
/Services.*{/,/}/ {
origbuf = origbuf $0 ORS
}
/usinessServices.*{/,/}/ {
buf = buf $0 ORS
}
END {
printf "%s", origimportbuf
gsub(/BusinessServices/,"UserServices",importbuf)
gsub(/businessServices/,"userServices",importbuf)
printf "%s", importbuf
printf "%s", origbuf
gsub(/BusinessServices/,"UserServices",buf)
gsub(/businessServices/,"userServices",buf)
printf "%s", buf
};
' in.txt
Actual Output (some line breaks disappear):
import com.my.ClientBusinessServicesRequest;
import com.my.ClientBusinessServicesResponse;
import com.my.ClientOtherServicesRequest;
import com.my.ClientOtherServicesResponse;
import com.my.ClientUserServicesRequest;
import com.my.ClientUserServicesResponse;
ClientBusinessServicesResponse callClientBusinessServices(String businessServicesRequestKey) {
ClientBusinessServicesRequest clientBusinessServicesRequest = new ClientBusinessServicesRequest();
ClientBusinessServicesResponse clientBusinessServicesResponse = new ClientBusinessServicesResponse();
clientBusinessServicesRequest.setKey(businessServicesRequestKey);
clientBusinessServicesResponse = callClientBusinessServicesInternal(clientBusinessServicesRequest);
return clientBusinessServicesResponse;
}
ClientOtherServicesResponse callClientOtherServices(String otherServicesRequestKey) {
}
ClientUserServicesResponse callClientUserServices(String userServicesRequestKey) {
ClientUserServicesRequest clientUserServicesRequest = new ClientUserServicesRequest();
ClientUserServicesResponse clientUserServicesResponse = new ClientUserServicesResponse();
clientUserServicesRequest.setKey(userServicesRequestKey);
clientUserServicesResponse = callClientUserServicesInternal(clientUserServicesRequest);
return clientUserServicesResponse;
}