使用 sed 删除字符串两端的左方括号和右方括号

使用 sed 删除字符串两端的左方括号和右方括号

我在 Ubuntu 12.04.1 LTS 上的 bash shell 中运行此命令。我试图一次性删除[和字符,即无需再次通过管道传输到 sed。]

我知道方括号在正则表达式中有特殊含义,所以我通过在前面添加反斜杠来转义它们。我期望的结果只是字符串,123但方括号仍然存在,我很想知道为什么!

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

答案1

这很容易,如果你遵循手动的小心:字符类中的所有成员都会失去特殊含义(少数例外)。如果 ] 被放置在第一的在列表中。尝试:

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

这说:

  1. 在 - 的里面[ 中括号 ] 中,替换其中任意一个字符,即:
    • ]
    • [
  2. 用空字符串替换其中任何一个——因此替换字符串为空//
  3. 取代它们到处全球)——因此最终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

相关内容