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

sdo*_*oca 1 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"
Run Code Online (Sandbox Code Playgroud)

它输出:

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

Extracted: cd167095
Run Code Online (Sandbox Code Playgroud)

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

cd.efghigName : cd167095 
Run Code Online (Sandbox Code Playgroud)

cd167095
Run Code Online (Sandbox Code Playgroud)

为什么返回第二场比赛?

Dig*_*oss 5

因为它"贪婪"

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

要查看此内容,请将第二个更改cdef或者其他内容,您将看到脚本返回第一个.

现在,如果你使用像Ruby,Python或Perl这样的东西,你会得到更精细的正则表达式,你可以使用.*?哪种是"非贪婪"的形式.*.

#!/usr/bin/env ruby

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

虽然真的,我只想写:

string[/cd.*/]
Run Code Online (Sandbox Code Playgroud)