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

sed - Search and replace always puts capture group at the end

我正在跨大量文件重构一些代码,并尝试在 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 >/g"

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

我得到的输出如下所示: fooActions: Partial<typeof >fooActionCreators

我不明白为什么我的捕获组被放在 then 末尾而不是我在替换子句中的位置。

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

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

$ echo 'Actions: typeof foo' |  gsed  -e "s/Actions: typeof \(\w*\)/Actions: Partial<typeof >/g"
Actions: Partial<typeof foo>

否则你可以使用 [a-zA-Z]* 而不是 \w*

$ echo 'Actions: typeof foo' |  sed  -e "s/Actions: typeof \([a-zA-Z]*\)/Actions: Partial<typeof >/g"
Actions: Partial<typeof foo>

您看到的看似奇怪的行为是因为在普通 sed 版本中,\w* 匹配您希望匹配的内容前面的空字符串,如下所示:

Plain sed 匹配 a

前面的空字符串
$ echo a | sed "s/\(\w*\)/x/"
xa

Gnu sed 按预期匹配 a

$ echo a | gsed "s/\(\w*\)/x/"
ax

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

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