sed-搜索和替换总是将捕获组放在末尾

sed-搜索和替换总是将捕获组放在末尾,sed,xargs,ag,Sed,Xargs,Ag,我正在重构大量文件中的一些代码,并尝试在Mac上使用sed进行搜索和替换 我们的目标是: fooActions:fooActionCreators的类型 为此: fooActions:Partial 我用这个sed表达式使它大部分工作: ag-l“Actions:typeof”| xargs sed-i“-e”s/Actions:typeof\(\w*\)/Actions:Partial/g“ 基本上是使用ag查找包含匹配字符串的文件名列表,然后使用xargs将这些文件名作为输入传递到mysed

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

我们的目标是:

fooActions:fooActionCreators的类型

为此:

fooActions:Partial

我用这个sed表达式使它大部分工作:

ag-l“Actions:typeof”| xargs sed-i“-e”s/Actions:typeof\(\w*\)/Actions:Partial/g“

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

我得到的输出如下所示:
fooActions:PartialfooActionCreators


我不明白为什么我的捕获组被放在then end而不是replace子句中的位置。

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

如果您有gsed(gnu sed),这应该可以按预期工作

$ echo 'Actions: typeof foo' |  gsed  -e "s/Actions: typeof \(\w*\)/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

如果您的数据在“d”文件中,由gnu sed

sed -E 's/^(fooAction)s: (typeof \1Creators)/\1s: Partial<\2>/' d
sed-E的/^(fooAction)s:\1Creators的类型/\1s:Partial/'d
sed -E 's/^(fooAction)s: (typeof \1Creators)/\1s: Partial<\2>/' d