如何在正则表达式字符 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'
此处,]
字符必须紧跟在左方括号之后,否则将被视为括号表达式闭括号,括号表达式过早关闭。
请注意,如果您想在括号表达式中安全地使用 -
,您可以在右方括号之前使用它。
这可以在 bash
本身完成,无需调用任何外部实用程序,如 awk
或 sed
:
s="foo}bar]baz"
echo "${s//[]\}]/@}"
foo@bar@baz
另一种选择是tr
:
tr '[]}]' '@' <<< "$s"
foo@bar@baz
此命令按预期工作:
$ 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'
此处,]
字符必须紧跟在左方括号之后,否则将被视为括号表达式闭括号,括号表达式过早关闭。
请注意,如果您想在括号表达式中安全地使用 -
,您可以在右方括号之前使用它。
这可以在 bash
本身完成,无需调用任何外部实用程序,如 awk
或 sed
:
s="foo}bar]baz"
echo "${s//[]\}]/@}"
foo@bar@baz
另一种选择是tr
:
tr '[]}]' '@' <<< "$s"
foo@bar@baz