在shell中的两组字符之间获取字符串

时间:2017-05-24 14:26:35

标签: bash sed

我将以下字符串"version": "1.0.0",传递给sed,我试图将1.0.0从中删除。我希望通过规则得到它:在: "",之间获取字符串。

我一直在尝试以下方法:

sed -e '/:\ \"/,/\ ",/p'
sed -e 's/:\ \"\(.*\)\",/\1/'

第一个没有做任何事情,最后一个返回"version"1.0.0,这是接近但没有雪茄。我错过了什么?

2 个答案:

答案 0 :(得分:1)

您需要在搜索模式的任意一侧使用.*来匹配完整输入,以便能够仅使用捕获的组的反向引用替换整行。

sed应该有效:

s='"version": "1.0.0",'

sed 's/.*: "\([^"]*\)",.*/\1/' <<< "$s"    
1.0.0

甚至是这个:

sed 's/.*: "\(.*\)",.*/\1/' <<< "$s"
1.0.0

答案 1 :(得分:1)

另一种方法,使用grep with lookahead / lookbehind:

$ grep -oP '(?<=: ")[^"]*(?=")' <<< '"version": "1.0.0",'
1.0.0

或更短,使用\K从匹配的字符串中排除: "

$ grep -oP ': "\K[^"]+' <<< '"version": "1.0.0",'
1.0.0