在括号之间提取字符串

时间:2014-08-10 07:17:29

标签: bash awk sed grep

如何在括号中提取精确的字符串?

我尝试的是:

echo "test [test1] test" | grep -Po "(?=\[).*?(?=\])"

但输出是:

[test1

应该是:

test1

最好使用grep

5 个答案:

答案 0 :(得分:6)

使用lookbehind:

echo "test [test1] test" | grep -Po "(?<=\[).*?(?=\])"

答案 1 :(得分:4)

awk也应该这样做:

echo "test [test1] test" | awk -F"[][]" '{print $2}'
test1

sed

echo "test [test1] test" | sed 's/[^[]*\[\|\].*//g'
test1

答案 2 :(得分:3)

另一种解决方案,值得一提:

echo "test [test1] test" | grep -Po '[^\[]+(?=[\]])'

在这种情况下,模式A(?=B)表示:查找A,其中表达式B

如果您想要[],可以试试这个:

echo "test [test1] test" | grep -Po '[\[].*[\]]'

答案 3 :(得分:2)

我宁愿否定]以防止贪婪匹配:

echo "test [test1] test [test2] xyz" | grep -Po "(?<=\[)[^\]]*(?=\])"

输出:

test1
test2

答案 4 :(得分:1)

这适用于任何版本的sed,因为它只是一个普通的旧BRE:

$ echo "test [test1] test" | sed 's/.*\[\(.*\)\].*/\1/'
test1
相关问题