在正则表达式中的字符类中使用方括号

Sag*_*gar 3 bash sed

我有一个字符串:

['A', 'B']
Run Code Online (Sandbox Code Playgroud)

我需要删除所有,[]字符。最终结果应该是

'A' 'B'
Run Code Online (Sandbox Code Playgroud)

以下是我尝试过的所有内容以及结果的列表

我尝试过的命令

user@vm:~$ echo "['A', 'B']" | sed -r 's/[\[\],]//g'
['A', 'B']

user@vm:~$ echo "['A', 'B']" | sed -r 's/[[],]//g'  # unescaped
['A', 'B']

user@vm:~$ echo "['A', 'B']" | sed -r 's/[\[\]]//g'  # removed ","
['A', 'B']

user@vm:~$ echo "['A', 'B']" | sed -r 's/[,]//g'  #removed "[" and "]"
['A' 'B']

user@vm:~$ echo "['A', 'B']" | sed -r 's/[[,]//g'  # removed "]"
'A' 'B']
Run Code Online (Sandbox Code Playgroud)

显然,它们都不起作用。但是,这些命令可以:

user@vm:~$ echo "['A', 'B']" | sed -r 's/[],[]//g'
'A' 'B'

user@vm:~$ echo "['A', 'B']" | sed -r 's/[][,]//g'
'A' 'B'
Run Code Online (Sandbox Code Playgroud)

为什么要这样做?上下命令之间的区别:

  • []都没有逃脱
  • 顺序不同()在[]之前

为什么顺序很重要?

Sun*_*eep 5

info sed(另请参见https://www.gnu.org/software/sed/manual/sed.html#Character-Classes-and-Bracket-Expressions

前导“ ^”颠倒了LIST的含义,因此它与LIST中没有的任何单个字符匹配。要在列表中包括“]”,请使其成为第一个字符(如果需要,请在“ ^”之后);在列表中包括“-”,应使其成为第一个或最后一个字符;在第一个字符后加上“ ^”。

而且如评论中所述,tr更适合

$ echo "['A', 'B']" | tr -d '[],'
'A' 'B'
Run Code Online (Sandbox Code Playgroud)