使用Unix的sed替换JS路径

3

大家晚上好。 我正在尝试使用Unix sed脚本替换*.js文件中的路径。我编写了正确的正则表达式,sed没有报错,但是我无法得到正确的结果。

更新:我正在使用macOS。

输入字符串:import * as module from "/test"

我的正则表达式:

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

这是一个找到路径模式并返回两个我所需要的组(* as module/test.js)的代码。

例如,我需要将 import \* as module from "/test" 改为 import \* as module from "/myFolder/test.js"

然而,我的Bash命令

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

返回原始字符串!请问,它有什么问题吗?

2个回答

2

使用 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"

正则表达式解释:

  • \\b:匹配单词边界
  • (import.+ from ):匹配从单词import开始的字符串,后跟1个或多个任意字符,然后是由空格包围的from单词
  • (['\"]):匹配'"作为开头引号,并捕获在第二组中
  • ([^'\"]+):匹配一个或多个非引号字符,并将其捕获在第三组中
  • \2:匹配与开头引号相同的引号

在OSX上使用以下sed命令:

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

1
似乎在 macOS 上无法正常工作... - evgkch
你是在OSX上尝试吗?你的问题中有sed -r,这是gnu awk中使用的。 - anubhava
更新针对OSX的答案。 - anubhava

1

根据您提供的样例,请尝试以下awk代码。该代码使用GNU awk编写和测试。

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

解释:以下是上述代码的详细解释。

  • 创建一个名为s的变量,其中包含所有输入到awk程序中的值。
  • 通过echo命令打印它,并将其作为标准输入传递到此处的awk程序中。
  • awk程序中检查条件,如果一行满足^import.*from[[:space:]]+"\/正则表达式(这基本上检查了从import开始直到from后跟空格(s)后跟"/的行),如果为TRUE,则会发生以下操作。
  • 使用awksub函数执行替换,将/替换为/myFolder/,以满足要求。
  • 然后指定1是以打印当前行的方式在awk中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接