Shell正则表达式方括号多次出现

时间:2014-06-24 19:58:31

标签: bash shell sed

我正在编写一个shell脚本,它使用sed返回方括号内的内容

sed 's/.*\[\([^]]*\)\].*/\1/g'

问题是即使多次出现也只返回一次。 我想要它以便它返回所有出现的东西,我需要改变什么?

4 个答案:

答案 0 :(得分:3)

只会出现一次,因为其他方括号将与您用模式包围的.*匹配。

相反,请将其重写为仅匹配您想要的部分,例如将.*替换为[^[]*

sed -n 's/[^[]*\[\([^]]*\)\][^[]*/\1 /gp'

答案 1 :(得分:1)

您可以尝试此awk

awk -F"[][]" '{for (i=2;i<=NF;i+=2) print $i}' file

答案 2 :(得分:0)

我对sed(暂时)不太满意,但我希望我的grep解决方案适合您:

grep -oE '\[[^]]*\]'
  • -o是为了获得完全匹配
  • -E是使用正则表达式
  • 正则表达式获取括号之间的所有内容,但右括号除外(例如[foo] bar [baz] foo将返回[foo] [bar],而不是[foo] bar [baz]

答案 3 :(得分:0)

这可能适合你(GNU sed):

sed 's/[^[]*\[\([^]]*\)\][^[]*/\1/g' file

你遇到的问题是使用.*贪婪并绕过了[..]的最后一次