我在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
您可以使用\[
转义左括号。 对于右括号,请使用[]]
。