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?
CodePudding user response:
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 wordimport
followed by 1 of any character followed by wordfrom
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"
CodePudding user response:
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 forawk
program in it. - Printing it by
echo
command and passing it as a standard input toawk
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 ofawk
to perform substitution to substitute/
with/myFolder/
as per requirement. - Then mentioning
1
is a way to print current line inawk
.
CodePudding user response:
Using sed
$ sed 's|/[^"]*|/myFolder&|' input_file
import * as module from "/myFolder/test.js"