使用sed删除字符串周围的左方括号和右方括号


19

我在Ubuntu 12.04.1 LTS的bash shell中运行此命令。我正在尝试一次删除掉[]字符,即不必通过管道再次进行sed。

我知道方括号在正则表达式中有特殊含义,因此我在前面加上反斜杠来对其进行转义。我期望的结果只是字符串,123但仍然保留了方括号,我很想知道为什么!

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

我最终要实现的是将方括号之间的任何内容分配给bash变量,以供在bash脚本中的其他地方使用,因此,如果有更好的方法来实现(通过使用awk,也许是?),请告诉我。
Xhantar

2
只是添加评论:您可以使用bash的PE功能,如下所示: str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
Valentin Bajrami 2013年

1
@ val0x00ff-纯bash替换..谢谢!:)学到了一些新东西。
Xhantar

Answers:


25

如果您仔细阅读本手册,这很容易:一个字符类中的所有成员都失去特殊含义(少数例外)。如果]放在列表的第一位,则它会失去其特殊含义。尝试:

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

这说:

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

同样,无论何时将其包括在内,都] 必须在该类中名列第一。


11

我不确定为什么这行不通,但这可以:

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种方法(egrep -o ...)看起来像是解决我的问题的最干净的方法。我只会在方括号之间使用整数(对不起,我应该在我的问题中提到这一点),所以我不会遇到任何奇怪的事情。谢谢!
Xhantar

3
您还可以使用trecho '[123]' | tr -d '[]'-避免正则表达式在转义上造成混淆。
James O'Gorman 2013年

@James O'Gorman-有趣。由于某种原因,我认为tr一次最多只能翻译一个字符,但是我错了。谢谢!
Xhantar

4

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

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

如果您的数据总是这样,则以方括号开头和结尾:

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

我正在使用的数据将始终以方括号“ yes”开头和结尾。我仍然想知道为什么我的解决方案无法正常工作。有任何想法吗?还有没有指定2x正则表达式的方法吗?
Xhantar

1
@Guru这个解决方案对我有效,对于Xhantar来说,这是一个很晚的答复,但是我从您的代码和tldp.org的Bash初学者指南中可以看到,您正在尝试进行多个搜索和替换,其中之一是'['和另一个代表']'都行不通,将两个不同的搜索间隔开并替换为“;” 或-e选项。的/ <搜索> / <替换> / g; s / <search> / <replace> / g'或sed -e's / <search> / <replace> /
g'

1

如果您有一个更复杂的字符串,例如'abcdef [123] ghijk',则还可以使用内部bash命令'cut'仅在方括号之间提取文本:

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

1

您可以使用来逃避左括号\[。对于右括号,请使用[]]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.