我有一个文件input.txt,其中包含以下内容:
https://maps.googleapis.com/maps/api/staticmap?size=480x480&markers=icon:http://chart.apis.google.com/chart?chst=d_map_pin_icon&chld=cafe%7C996600
要匹配输入中的foo
[assembly: AssemblyVersion("1.2.3")]
bar")]
quux
,请使用以下脚本:
1.2.3
我希望输出为#!/bin/bash
regex='\[assembly: AssemblyVersion\("(.*)"\)\]'
fileContent=$(cat input.txt)
[[ "$fileContent" =~ $regex ]]
echo "${BASH_REMATCH[1]}"
,但它是:
1.2.3
为什么会这样?如何解决?
https://regex101.com处的正则表达式测试程序按预期工作。
答案 0 :(得分:4)
.*
被称为贪婪点匹配子模式,它匹配"
和)
,任何字符including a newline。
因此,限制贪婪的最佳技巧是使用否定的字符类[^"]
,它将匹配除"
之外的任何字符(如果引用的字符串中没有引号):
'\[assembly: AssemblyVersion\("([^"]*)"\)\]'
^^^^^
或 - 如果引用的字符串中不应包含(
和)
:
'\[assembly: AssemblyVersion\("([^()]*)"\)\]'
^^^^^