使用sed删除围绕string的开合方括号

我在Ubuntu 12.04.1 LTS的bash shell中运行这个命令。 我试图一举删除[]字符,也就是说,不必再次inputsed。

我知道方括号在正则expression式中有特殊含义,所以我通过预先加一个反斜杠来逃避它们。 我期待的结果只是string123但方括号仍然存在,我很想知道为什么!

 ~$ echo '[123]' | sed 's/[\[\]]//' [123] 

如果仔细阅读手册 ,这很容易:angular色类的所有成员都失去了特殊的含义(有一些例外)。 如果放在第一位,就会失去意义。 尝试:

 $ echo '[123]' | sed 's/[][]//g' 123 $ 

这就是说:在外部 [括号内],用空string(因此// )replace所有列出的字符,即][ – (因此最终的g )。 再一次, ]必须是class上第一名。

我不知道为什么这不起作用,但确实如此:

 echo '[123]' | sed 's/\(\[\|\]\)//g' 

或这个:

 echo '[123]' | sed -r 's/(\[|\])//g' 

您也可以尝试不同的方法,并匹配括号内的string(假设string可以很容易地匹配,而不是由括号定义):

 echo '[123]' | egrep -o "[0-9]+" 

我用你的原始正则expression式使用grep遇到同样的麻烦,所以我怀疑这不仅仅是一个sed事情。

奇怪的是,这些产生不同的结果,但其中一个匹配你想要的:

 echo '[123]' | egrep -o '[^][]+' 123 echo '[123]' | egrep -o '[^[]]+' 3] 

把它应用到你原来的sed (并添加/g修饰符,这样就可以删除两个括号):

 echo '[123]' | sed 's/[][]//g' 123 

删除括号前后的所有内容:

 $ echo '[123]' | sed 's/.*\[//;s/\].*//;' 123 

如果你的数据是这样的,总是用方括号开始和结束:

 $ echo '[123]' | sed 's/.//;s/.$//;' 123 

如果你有一个更复杂的string,如'abcdef [123] ghijk',你也可以使用内部bash命令'cut'来提取方括号内的文本:

 $ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1 123 

您可以使用\[转义左括号。 对于右括号,请使用[]]