0

Iterating through files with a specific extension and changing all occurrences of a substring with sed. Sometimes there are multiple occurrences per line. This is the command:

find . -type f -name "*.js" -exec sed -i '' s,/.*/marlon/express,/usr/src/app,g {} +

Iterating through js files to replace all occurrences of that wildcareded substring with /usr/src/app.

This works great on lines with a single occurrence but with multiple it seems to mess it up. It turned this:

__cov_cMGKPxliNj_ByZm9tnD9jQ['/Users/willashworth/Documents/Pimberly/marlon/express/client/js/manifest.js'] = {"path":"/Users/willashworth/Documents/Pimberly/marlon/express/client/js/manifest.js","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}};

...to this:

__cov_cMGKPxliNj_ByZm9tnD9jQ['/usr/src/app/client/js/manifest.js","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}};

The command seemed to remove everything from '] = {"path":"/Users/willashworth/Documents/Pimberly/marlon/express/client/js/manifest.js which is the 2nd occurrence in that file.

The whole file is:

var __cov_cMGKPxliNj_ByZm9tnD9jQ = (Function('return this'))();
if (!__cov_cMGKPxliNj_ByZm9tnD9jQ.__coverage__) { __cov_cMGKPxliNj_ByZm9tnD9jQ.__coverage__ = {}; }
__cov_cMGKPxliNj_ByZm9tnD9jQ = __cov_cMGKPxliNj_ByZm9tnD9jQ.__coverage__;
if (!(__cov_cMGKPxliNj_ByZm9tnD9jQ['/Users/willashworth/Documents/Pimberly/marlon/express/client/js/manifest.js'])) { 
    __cov_cMGKPxliNj_ByZm9tnD9jQ['/Users/willashworth/Documents/Pimberly/marlon/express/client/js/manifest.js'] = {"path":"/Users/willashworth/Documents/Pimberly/marlon/express/client/js/manifest.js","s":{},"b":{},"f":{},"fnMap":{},"statementMap":{},"branchMap":{}};
}
__cov_cMGKPxliNj_ByZm9tnD9jQ = __cov_cMGKPxliNj_ByZm9tnD9jQ['/Users/willashworth/Documents/Pimberly/marlon/express/client/js/manifest.js'];

With the issue being on line 5

EDIT

I have built this command from this answer: find & sed (search and replace)

Jeff Schaller
  • 67,283
  • 35
  • 116
  • 255
wmash
  • 101
  • 2
  • I don't think it's "ignoring [the] global flag" - it's just applying .* greedily – steeldriver Nov 23 '18 at 13:26
  • @steeldriver ah that would make sense! Do you have any idea on how to rectify that? I am new to sed – wmash Nov 23 '18 at 13:30
  • what exactly do you want the /.*/ to match? a single directory component, or something else? – thrig Nov 23 '18 at 14:48
  • @thrig the /.*/ should match /Users/willashworth/Documents/Pimberly/. I am using a wildcard though instead of hardcoding as different users will have a different filepath but the /marlon/express will remain constant which is why I am trying to use that as a terminator to stop the greedy operator ripping through the rest of the line – wmash Nov 23 '18 at 14:52

1 Answers1

0

Figured it out. Used find . -type f -name "*.js" -exec sed -i '' s,/[^]]*/marlon/express,/usr/src/app,g {} +. The parentheses stops it from greedily ripping through the rest of the line.

Thanks to this answer for steering me in the right direction: https://stackoverflow.com/questions/1685575/sed-regex-to-non-greedy-replace

wmash
  • 101
  • 2