我一直在研究使用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)
为什么返回第二场比赛?
第一个.*匹配尽可能地使表达式作为一个整体成功.
要查看此内容,请将第二个更改cd为ef或者其他内容,您将看到脚本返回第一个.
现在,如果你使用像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)