Bash regexp。*匹配得太过分了

时间:2015-12-10 11:32:35

标签: regex bash

我有一个文件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处的正则表达式测试程序按预期工作。

1 个答案:

答案 0 :(得分:4)

.*被称为贪婪点匹配子模式,它匹配"),任何字符including a newline

因此,限制贪婪的最佳技巧是使用否定的字符类[^"],它将匹配除"之外的任何字符(如果引用的字符串中没有引号):

'\[assembly: AssemblyVersion\("([^"]*)"\)\]'
                                ^^^^^ 

Demo

或 - 如果引用的字符串中不应包含()

'\[assembly: AssemblyVersion\("([^()]*)"\)\]'
                                ^^^^^  

Demo