regexp(sed)如何1-escape特殊字符和2-group它们

时间:2011-05-13 23:58:31

标签: regex bash shell sed

我需要一个正则表达式,它可以提取由相同的非字母字符包围的任意两个数字组,例如从字符串“my_file_name-02-and_some”中提取“02”

据我所知:

echo 'my_file_name-02-and_some' | sed 's/.*[-_]\([0-9][0-9]*\)[-_].*/\1/g'

产生

02(phew,结果为两小时+)但是

echo 'my_file_name-002-and_some' | sed 's/.*[-_]\([0-9][0-9]*\)[-_].*/\1/g'

生成

002所以它并没有真正起作用:(。另外我希望它匹配“my_file_name(02)and_some”和其他可能的周围角色,这个想法是那两个周围的角色必须是一样的......?Gosh,我的头疼。

我担心根据上下文,这个 是一个sed regexp。

2 个答案:

答案 0 :(得分:2)

对于周围的相同字符:

twonum=`echo 'my_file_name-00-andsome' | sed 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'`

将生成00.请记住,您也可以在LHS中使用反向引用。

sed 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/'
            ^this is 1st     ^that's \1 mean: THE SAME as in 1st \(...\) group

添加match []和()可以使用这个(不好,但希望有效)

sed 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/;s/^.*(\([0-9][0-9]\)).*$/\1/;s/^.*\[\([0-9][0-9]\)\].*$/\1/'

答案 1 :(得分:1)

这将是您的问题:

([0-9][0-9]*)

如果您只想要两位数字,那么您不需要*,这意味着“在我之前的0或更多”。这就是为什么它匹配002