1

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

目标是从这个出发:

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

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

4

2 回答 2

1

mac自带的sed不支持\wword字符。

如果你有 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
于 2019-04-11T23:37:31.517 回答
0

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

sed -E 's/^(fooAction)s: (typeof \1Creators)/\1s: Partial<\2>/' d
于 2019-04-12T10:54:06.617 回答