sed - 搜索和替换总是将捕获组放在最后

问题描述 投票:1回答:2

我在很多文件中重构一些代码,我正在尝试使用Mac上的sed进行搜索和替换。

目标是从这个:

fooActions: typeof fooActionCreators

对此:

fooActions: Partial<typeof fooActionCreators>

我已经得到它主要使用这个sed表达式:

ag -l "Actions: typeof " | xargs sed -i "" -e "s/Actions: typeof \(\w*\)/Actions: Partial<typeof \1>/g"

基本上使用ag查找包含匹配字符串的文件名列表,然后使用xargs将这些作为输入传递给我的sed表达式。

我得到的输出看起来像这样:fooActions: Partial<typeof >fooActionCreators

我无法弄清楚为什么我的捕获组被放置在最后,而不是我在替换子句中的位置。

sed xargs ag
2个回答
1
投票

mac附带的sed不支持word字符的\w

如果你有gsed(gnu sed)这应该按预期工作。

$ echo 'Actions: typeof foo' |  gsed  -e "s/Actions: typeof \(\w*\)/Actions: Partial<typeof \1>/g"
Actions: Partial<typeof foo>

否则你可以使用[a-zA-Z]*而不是\w*

$ echo 'Actions: typeof foo' |  sed  -e "s/Actions: typeof \([a-zA-Z]*\)/Actions: Partial<typeof \1>/g"
Actions: Partial<typeof foo>

你看到的看似奇怪的行为是因为在普通的sed版本中,\w*匹配你希望匹配的东西前面的空字符串,如下图所示:

普通的sed匹配a前面的空字符串

$ echo a | sed "s/\(\w*\)/\1x/"
xa

Gnu sed按照预期匹配a

$ echo a | gsed "s/\(\w*\)/\1x/"
ax

0
投票

如果你的数据在'd'文件中,请通过gnu sed,

sed -E 's/^(fooAction)s: (typeof \1Creators)/\1s: Partial<\2>/' d
© www.soinside.com 2019 - 2024. All rights reserved.