我正在重构大量文件中的某些代码,并尝试在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
我不知道为什么将捕获组放在末尾,而不是放在替换子句中。
答案 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