为什么这个bash / sed调用有效?

时间:2010-12-10 21:20:23

标签: regex bash sed

我一直在研究使用sed来使用正则表达式提取子字符串的示例,我有一个测试脚本正常工作。问题是我不明白为什么和想。这是脚本:

#!/bin/bash

string="       ID  : s0016b54e23bc.ab.cd.efghig\
Name : cd167095"
echo -e "string: '$string'"
name=`echo $string | sed 's/.*\(cd.*\)/\1/'`
echo -e "\nExtracted: $name"

它输出:

string: '       ID  : s0016b54e23bc.ab.cd.efghigName : cd167095'

Extracted: cd167095

正则表达式应该有两个匹配:

cd.efghigName : cd167095 

cd167095

为什么返回第二场比赛?

1 个答案:

答案 0 :(得分:5)

因为它“贪婪”

第一个.*尽可能地匹配表达式作为一个整体来成功。

要查看此内容,请将第二个cd更改为ef或其他内容,您将看到该脚本返回第一个。

现在,如果你使用像Ruby,Python或Perl这样的东西,你会得到更复杂的正则表达式,你可以使用.*?,这是.*的“非贪婪”形式。 / p>

#!/usr/bin/env ruby

string="       ID  : s0016b54e23bc.ab.cd.efghig\
Name : cd167095"
puts string.gsub /.*?(cd.*)/, '\1'
so ross$ ./qq3
cd.efghigName : cd167095

虽然真的,但我会写:

string[/cd.*/]