如何在正则表达式字符 class 内转义右方括号?

How to escape closing square bracket within regular expression character class?

此命令按预期工作:

$ echo "foo}bar]baz" | sed 's/}/@/g; s/]/@/g'
foo@bar@baz

现在我正尝试使用字符 class 做同样的事情,如下所示:

$ echo "foo}bar]baz" | sed 's/[}\]]/@/g'
foo}bar]baz

这没有用。我想要一个字符 class 和两个字符 }] 所以我认为像 }\] 这样转义方括号会起作用但它没有。

我错过了什么?

您可以使用 "smart" 展示位置:

echo "foo}bar]baz" | sed 's/[]}]/@/g'

online sed demo

此处,]字符必须紧跟在左方括号之后,否则将被视为括号表达式闭括号,括号表达式过早关闭。

请注意,如果您想在括号表达式中安全地使用 -,您可以在右方括号之前使用它。

这可以在 bash 本身完成,无需调用任何外部实用程序,如 awksed:

s="foo}bar]baz"
echo "${s//[]\}]/@}"

foo@bar@baz

另一种选择是tr:

tr '[]}]' '@' <<< "$s"

foo@bar@baz