我正在编写一个shell脚本,它使用sed返回方括号内的内容
sed 's/.*\[\([^]]*\)\].*/\1/g'
问题是即使多次出现也只返回一次。 我想要它以便它返回所有出现的东西,我需要改变什么?
答案 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
你遇到的问题是使用.*
贪婪并绕过了[..]
的最后一次