使用 unix sed 替换 js 路径
Replace js path using unix sed
大家晚上好。
我正在尝试使用 unix sed 脚本替换 *.js
文件中的路径。所以,我写了正确的正则表达式,sed 没有落下,但我得不到正确的结果。
UPD: 我正在使用 macOS
传入字符串:import * as module from "/test"
我的正则表达式:
\s\*import(.+)from\s+\['\"\](\/.+)[^\n]+
找到路径模式和 returns 我需要的两个组(* 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 from \"\/myFolder\":g "
returns原来的字符串!请问有什么问题吗?
使用gnu-sed
:
s='import * as module from "/test.js"'
sed -E "s~\b(import.+ from )(['\"])([^'\"]+)~/myFolder~g" <<< "$s"
import * as module from "/myFolder/test.js"
正则表达式解释:
\b
:匹配一个单词边界
(import.+ from )
:匹配以单词import
开始的字符串,后跟任何字符的1+,后面跟着单词from
,两边用space包围
(['\"])
:匹配 '
或 "
作为开场引号并在组 #2 中捕获
([^'\"]+)
:匹配 1+ 个不是引号的字符并捕获到组 #3
</code>: 匹配与开头引号相同的引号</li>
</ul>
<hr />
<p>在 OSX 上使用此 <code>sed
:
sed -E "s~(import.+ from )(['\"])([^'\"]+)~/myFolder~g" <<< "$s"
使用sed
$ sed 's|/[^"]*|/myFolder&|' input_file
import * as module from "/myFolder/test.js"
使用您显示的示例,请尝试以下 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 后跟 space(s) 后跟“/”如果这是 TRUE,那么将执行以下操作。
- 使用
awk
的 sub
函数执行替换,根据要求用 /myFolder/
替换 /
。
- 然后提到
1
是一种在 awk
. 中打印当前行的方法
大家晚上好。
我正在尝试使用 unix sed 脚本替换 *.js
文件中的路径。所以,我写了正确的正则表达式,sed 没有落下,但我得不到正确的结果。
UPD: 我正在使用 macOS
传入字符串:import * as module from "/test"
我的正则表达式:
\s\*import(.+)from\s+\['\"\](\/.+)[^\n]+
找到路径模式和 returns 我需要的两个组(* 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 from \"\/myFolder\":g "
returns原来的字符串!请问有什么问题吗?
使用gnu-sed
:
s='import * as module from "/test.js"'
sed -E "s~\b(import.+ from )(['\"])([^'\"]+)~/myFolder~g" <<< "$s"
import * as module from "/myFolder/test.js"
正则表达式解释:
\b
:匹配一个单词边界(import.+ from )
:匹配以单词import
开始的字符串,后跟任何字符的1+,后面跟着单词from
,两边用space包围(['\"])
:匹配'
或"
作为开场引号并在组 #2 中捕获
([^'\"]+)
:匹配 1+ 个不是引号的字符并捕获到组 #3</code>: 匹配与开头引号相同的引号</li> </ul> <hr /> <p>在 OSX 上使用此 <code>sed
:sed -E "s~(import.+ from )(['\"])([^'\"]+)~/myFolder~g" <<< "$s"
使用sed
$ sed 's|/[^"]*|/myFolder&|' input_file
import * as module from "/myFolder/test.js"
使用您显示的示例,请尝试以下 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 后跟 space(s) 后跟“/”如果这是 TRUE,那么将执行以下操作。 - 使用
awk
的sub
函数执行替换,根据要求用/myFolder/
替换/
。 - 然后提到
1
是一种在awk
. 中打印当前行的方法