如何在正则表达式字符类中避免闭合方括号?

3

这个命令按照预期运行:

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

现在我正在尝试使用字符类来完成相同的事情,像这样:

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

这样做没有起作用。我想要一个由两个字符}]组成的字符类,所以我尝试通过转义方括号来实现,例如}\],但是并没有成功。

我错过了什么?


1
请点击此处获取完整的解释。 - potong
此外,https://dev59.com/SZPfa4cB1Zd3GeqPI95w 可能会有所帮助。 - Ryszard Czech
2个回答

2
您可以使用“智能”放置:

(原文已保留HTML标记,无需翻译)
echo "foo}bar]baz" | sed 's/[]}]/@/g'

请查看在线sed演示

这里,]字符必须紧跟开方括号后出现,否则它会被视为括号表达式的关闭括号,从而提前关闭括号表达式。

请注意,如果您想在括号表达式中安全地使用-,可以将其放在关闭方括号之前。


1

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

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

foo@bar@baz

另一个选项是 tr:
tr '[]}]' '@' <<< "$s"

foo@bar@baz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接