使用 sed 删除字符串周围的开始和结束方括号

Xha*_*tar 33 bash regex sed

我正在 Ubuntu 12.04.1 LTS 上的 bash shell 中运行此命令。我试图一举删除[]字符,即不必第二次通过管道传输到 sed。

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

~$ echo '[123]' | sed 's/[\[\]]//'
[123]
Run Code Online (Sandbox Code Playgroud)

Sap*_*gus 44

如果您仔细遵循手册,这很容易:字符类中的所有成员都失去了特殊含义(只有少数例外)。并且 ] 如果放在列表的第一个位置就失去了它的特殊意义。尝试:

$ echo '[123]' | sed 's/[][]//g'
123
$
Run Code Online (Sandbox Code Playgroud)

这说:

  1. 外部[ 括号 ] 内,替换任何包含的字符,即:
    • ]
    • [
  2. 用空字符串替换它们中的任何一个 - 因此空替换字符串//
  3. 在任何地方全局)替换它们- 因此最终的g.

同样,无论何时包括在内,都] 必须在班级中排名第一。

  • @user1079505,不幸的是,没有严格的“一般正则表达式”之类的东西。正则表达式语法在不同环境(linux emacs、linux/unix 实用程序、shell、python、mongo 等)中存在细微差异。但是,如果正则表达式中允许使用字符类,则这是典型行为。 (2认同)

Lad*_*ada 13

我不确定为什么这不起作用,但这样做:

echo '[123]' | sed 's/\(\[\|\]\)//g'
Run Code Online (Sandbox Code Playgroud)

或这个:

echo '[123]' | sed -r 's/(\[|\])//g'
Run Code Online (Sandbox Code Playgroud)

您也可以尝试不同的方法并匹配括号内的字符串(假设字符串可以轻松匹配并且不是由括号定义的):

echo '[123]' | egrep -o "[0-9]+"
Run Code Online (Sandbox Code Playgroud)

我在使用原始正则表达式时遇到了同样的问题,grep所以我怀疑这不仅仅是一sed件事。

奇怪的是,这些会产生不同的结果,但其中之一符合您的要求:

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

echo '[123]' | egrep -o '[^[]]+'
3]
Run Code Online (Sandbox Code Playgroud)

将此应用于您的原始文件sed(并添加/g修饰符以删除两个括号):

echo '[123]' | sed 's/[][]//g'
123
Run Code Online (Sandbox Code Playgroud)

  • 你也可以使用`tr`:`echo '[123]' | tr -d '[]'` - 避免关于转义的正则表达式混淆。 (5认同)