我在很多文件中重构一些代码,我正在尝试使用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
我无法弄清楚为什么我的捕获组被放置在最后,而不是我在替换子句中的位置。
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
如果你的数据在'd'文件中,请通过gnu sed,
sed -E 's/^(fooAction)s: (typeof \1Creators)/\1s: Partial<\2>/' d