我需要一个正则表达式,它可以提取由相同的非字母字符包围的任意两个数字组,例如从字符串“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。
答案 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
。