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

时间:2019-04-11 22:05:05

标签: sed xargs ag

我正在重构大量文件中的某些代码,并尝试在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

我不知道为什么将捕获组放在末尾,而不是放在替换子句中。

2 个答案:

答案 0 :(得分:1)

mac随附的sed不支持spree/forbidden的字字符。

如果您已gsed(gnu sed),则该方法应能按预期工作。

\w

否则,您可以使用类似$ echo 'Actions: typeof foo' | gsed -e "s/Actions: typeof \(\w*\)/Actions: Partial<typeof \1>/g" Actions: Partial<typeof foo> 之类的东西来代替[a-zA-Z]*

\w*

您看到的看似奇怪的行为是因为在普通sed版本中,$ echo 'Actions: typeof foo' | sed -e "s/Actions: typeof \([a-zA-Z]*\)/Actions: Partial<typeof \1>/g" Actions: Partial<typeof foo> 与您希望匹配的对象前面的空字符串匹配,如下所示:

普通sed匹配\w*前面的空字符串

a

Gnu sed符合预期的$ echo a | sed "s/\(\w*\)/\1x/" xa

a

答案 1 :(得分:0)

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

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