我一直在研究使用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
为什么返回第二场比赛?
答案 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.*/]