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

时间:2017-05-18 16:45:15

标签: bash sed

我有一个字符串:

['A', 'B']

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

'A' 'B'

下面列出了我尝试过的所有内容以及结果

我试过的命令

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']

显然,它们都没有奏效。但是,这些命令确实:

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

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

为什么这样做?上下命令之间的差异:

  • []未转义
  • 顺序不同(] []
  • 之前

为什么订单很重要?

1 个答案:

答案 0 :(得分:4)

来自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'