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

regexp(sed)如何1-escape特殊字符和2-group特殊字符,regex,bash,shell,sed,Regex,Bash,Shell,Sed,我需要一个regexp,它可以提取由相同的非字母字符包围的任意两个数字组,比如从字符串“my_file\u name-02-and\u some”中提取“02” 就我所知: echo'my_file_name-02-and_some'| sed's/*[-\\([0-9][0-9]*\)[-\./\1/g' 产生 02(呸,两个小时以上)但是 echo'my_file_name-002-和'u some'| sed's/*[-\\([0-9][0-9]*\)[-\./\1/g' 产生 002所以

我需要一个regexp,它可以提取由相同的非字母字符包围的任意两个数字组,比如从字符串“my_file\u name-02-and\u some”中提取“02”

就我所知:

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

产生

02
(呸,两个小时以上)但是

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

产生

002
所以它没有真正起作用:(.我还想让它匹配“我的文件名(02)和一些”以及其他可能的周围字符,因为这两个周围字符必须是相同的..?天哪,我的头很痛


考虑到上下文,这个可能是一个sed regexp。

这将是您的问题:

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

如果您只需要两个数字,则不需要
*
,这意味着“0或更多我之前的内容”。这就是为什么它与周围相同的字符相匹配的原因:

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[]和()可以使用这一个(不太好,但希望可以工作)


那么在第二种情况下,预期的结果是什么?00,或者什么都不返回?在第二种情况下,不应该返回任何内容。啊,感谢onteria;以及关于匹配特殊字符,并对它们进行分组,以便我可以确定它们是相同的。事实上,我没有意识到如何在bash提示符中正确测试sed regexp;因为bash返回完整的s字符串如果未找到匹配项,则:
echo'my_file_name-002-和_some'./*[-[0-9][0-9].[-[u]./\1/g'
将生成
my_file_name-002-和_some
,这意味着如果输入:
echo'my_file_name-02-和(sed's/-[0-9].[-].*/\1/g'
您得到了一个很好的
02
,但这实际上意味着您的regexp失败了。这可能会让人感到困惑。@Xaccrochur我没有时间测试完整的代码,但基本的方法是这样做:
([0-9][0-9])
这将在两位数之前和之后对字符进行分组。然后我将使用bash检查第一个字符和最后一个字符是否相同。是的,就是Jomo!这正是我想要的:周围的字符被分组:)剩下的唯一问题是忽略了括号和括号(因为有非常自然的)所以
echo'my_file_name[00]和some'| sed's/^.\(.\)\([0-9][0-9]\)\1.$/\2/'
什么都不匹配:(我认为这值得再问一个问题……识别周围字符性质的部分到底在哪里?
sed 's/^.*\(.\)\([0-9][0-9]\)\1.*$/\2/;s/^.*(\([0-9][0-9]\)).*$/\1/;s/^.*\[\([0-9][0-9]\)\].*$/\1/'