我在 Ubuntu 12.04.1 LTS 上的 bash shell 中运行此命令。我试图一次性删除[
和字符,即无需再次通过管道传输到 sed。]
我知道方括号在正则表达式中有特殊含义,所以我通过在前面添加反斜杠来转义它们。我期望的结果只是字符串,123
但方括号仍然存在,我很想知道为什么!
~$ echo '[123]' | sed 's/[\[\]]//'
[123]
答案1
这很容易,如果你遵循手动的小心:字符类中的所有成员都会失去特殊含义(少数例外)。如果 ] 被放置在第一的在列表中。尝试:
$ echo '[123]' | sed 's/[][]//g'
123
$
这说:
- 在 - 的里面外[ 中括号 ] 中,替换其中任意一个字符,即:
]
和[
- 用空字符串替换其中任何一个——因此替换字符串为空
//
, - 取代它们到处(全球)——因此最终
g
。
再次,]
必须无论何时,它都是班级第一名。
答案2
我不确定为什么这不起作用但是这确实有效:
echo '[123]' | sed 's/\(\[\|\]\)//g'
或这个:
echo '[123]' | sed -r 's/(\[|\])//g'
您还可以尝试不同的方法并匹配括号内的字符串(假设该字符串可以轻松匹配并且不由括号定义):
echo '[123]' | egrep -o "[0-9]+"
我在使用您原来的正则表达式时遇到了同样的问题,grep
因此我怀疑这不仅仅是一个sed
问题。
奇怪的是,这些产生了不同的结果,但其中一个符合您的要求:
echo '[123]' | egrep -o '[^][]+'
123
echo '[123]' | egrep -o '[^[]]+'
3]
将其应用到您的原始版本sed
(并添加/g
修改器,以便删除两个都括号):
echo '[123]' | sed 's/[][]//g'
123
答案3
删除括号前后的所有内容:
$ echo '[123]' | sed 's/.*\[//;s/\].*//;'
123
如果您的数据像这样总是意味着以方括号开始和结束:
$ echo '[123]' | sed 's/.//;s/.$//;'
123
答案4
如果您有一个更复杂的字符串如“abcdef[123]ghijk”,您还可以使用内部 bash 命令“cut”仅提取方括号之间的文本:
$ echo 'abcdef[123]ghijk' | cut -d '[' -f 2 | cut -d ']' -f 1
123