evgkch
evgkch

Reputation: 647

Replace js path using unix sed

Good evening everybody. I'm trying to replace paths at *.js files using unix sed script. So, I wrote correct regex expression and sed does not fall, but I can not get a correct result.

UPD: I'm using macOS

Incoming string: import * as module from "/test"

My regex:

 \s\*import(.+)from\s+\['\\"\](\\/.+)[^\n]+

that found a path pattern and returns two groups I needed (* as module and /test.js)

For example I need to change import \* as module from "/test" as import \* as module from "/myFolder/test.js"

So, but my bash command

echo 'import * as module from "/test.js"' |
sed -r "s:\s*import(.+)from\s+['\"](\/.+)[^\n]+:import \1 from \"\/myFolder\2\":g "

returns the original string! Could you help please, what's wrong with it?

Upvotes: 3

Views: 199

Answers (2)

RavinderSingh13
RavinderSingh13

Reputation: 133620

With your shown samples, please try following awk code. Written and tested in GNU awk.

s='import * as module from "/test.js"'
echo "$s" | awk '/^import.*from[[:space:]]+"\//{sub(/\//,"/myFolder&")} 1'

Explanation: Following is the detailed explanation for above code.

  • Creating a variable named s which has all the values as input for awk program in it.
  • Printing it by echo command and passing it as a standard input to awk program here.
  • In awk program checking condition if a line satisfies ^import.*from[[:space:]]+"\/ regex(which basically checks if line starts from import till from followed by space(s) followed by "/) if this is TRUE then following action will happen.
  • using sub function of awk to perform substitution to substitute / with /myFolder/ as per requirement.
  • Then mentioning 1 is a way to print current line in awk.

Upvotes: 1

anubhava
anubhava

Reputation: 785581

Using gnu-sed:

s='import * as module from "/test.js"'
sed -E "s~\\b(import.+ from )(['\"])([^'\"]+)\2~\1\2/myFolder\3\2~g" <<< "$s"

import * as module from "/myFolder/test.js"

RegEx Explanation:

  • \\b: Match a word boundary
  • (import.+ from ): Match string starting from word import followed by 1+ of any character followed by word from surrounded with space on both sides
  • (['\"]): Match a ' or " as opening quote and capture in group #2
  • ([^'\"]+): Match 1+ of any character that is not a quote and capture in group #3
  • \2: Match same quote as the opening quote

On OSX use this sed:

sed -E "s~(import.+ from )(['\"])([^'\"]+)~\1\2/myFolder\3~g" <<< "$s"

Upvotes: 2

Related Questions