Bash 解释sed表达式的一部分-*\1$/p

Bash 解释sed表达式的一部分-*\1$/p,bash,sed,Bash,Sed,此代码输出的行中只有第一位和最后一位数字相同-是否有人可以用英语解释此代码的工作原理: seq 1000 | sed -nr -e '/^([0-9])([0-9])*\1$/p' 产出: 11 22 33 etc 我知道它在开始时查找一个数字,然后再查找另一个数字,但我不清楚如何使用\1$来获得答案?它在开始时查找一个数字,然后是零个或多个数字(注意第二个括号后的星号),最后检查结尾处的\1,该值表示与第一个括号中的值完全相同。它在开始处查找一个数字,后跟零个或多个数字(注意第二个括号后的

此代码输出的行中只有第一位和最后一位数字相同-是否有人可以用英语解释此代码的工作原理:

seq 1000 | sed -nr -e '/^([0-9])([0-9])*\1$/p'
产出:

11
22
33 etc

我知道它在开始时查找一个数字,然后再查找另一个数字,但我不清楚如何使用
\1$
来获得答案?

它在开始时查找一个数字,然后是零个或多个数字(注意第二个括号后的星号),最后检查结尾处的
\1
,该值表示与第一个括号中的值完全相同。

它在开始处查找一个数字,后跟零个或多个数字(注意第二个括号后的星号),最后检查结尾处的
\1
,它表示与第一个括号中完全相同的值。

\1
是“第一个匹配项”。
$
是“行尾”

因此
\1$
表示“将字符串开头的相同术语(即数字0-9)再次匹配到字符串末尾。

\1
是“第一个匹配的术语”。
$
是“行尾”


因此
\1$
的意思是“在字符串的末尾再次匹配在字符串开头找到的相同术语(即数字0-9)。

实际上,匹配的是任何数字:

([0-9])
后跟任意数量的数字

([0-9])*
后接第一个数字

\1
\1
是对第一个括号中的组的反向引用

注意中间的数字是无约束的:

$ seq 8000 | sed -nr -e '/^([0-9])([0-9])*\1$/p' | tail
7907
7917
7927
7937
7947
7957
7967
7977
7987
7997

实际上,它匹配的是任何数字:

([0-9])
后跟任意数量的数字

([0-9])*
后接第一个数字

\1
\1
是对第一个括号中的组的反向引用

注意中间的数字是无约束的:

$ seq 8000 | sed -nr -e '/^([0-9])([0-9])*\1$/p' | tail
7907
7917
7927
7937
7947
7957
7967
7977
7987
7997

它以匹配行首开始,然后括号是一个组(稍后可以引用),它是一个数字0-9。该组后面跟着另一组,也有一个数字,该组可以重复0或更多次。在此之后,将引用第一个组(第\1个组),并最终匹配行尾

所以,基本上,它只是说最后一个数字必须和第一个数字相同,它们之间可以有任意数量的数字

不需要对中间数字进行分组,因为它们没有被引用,因此可以按此方式重写

sed -nr -e '/^([0-9])[0-9]*\1$/p'
如果您希望最后一个数字与第一个数字相同,第二个数字与第二个数字相同,以便匹配1221245642而不是2424,那么您可以使用

sed -nr -e '/^([0-9])([0-9])[0-9]*\2\1$/p'

用seq 100000试试看,它以匹配行首开始,然后括号是一个组(后面可以引用),它是一个数字0-9。该组后面跟着另一组,也有一个数字,该组可以重复0或更多次。在此之后,将引用第一个组(第\1个组),并最终匹配行尾

所以,基本上,它只是说最后一个数字必须和第一个数字相同,它们之间可以有任意数量的数字

不需要对中间数字进行分组,因为它们没有被引用,因此可以按此方式重写

sed -nr -e '/^([0-9])[0-9]*\1$/p'
如果您希望最后一个数字与第一个数字相同,第二个数字与第二个数字相同,以便匹配1221245642而不是2424,那么您可以使用

sed -nr -e '/^([0-9])([0-9])[0-9]*\2\1$/p'

用seq 100000试试看,第二组参数是不必要的,因为它是一个单字符类。这与
sed'/^\([0-9]\)[0-9]*\1$/,做的事情是一样的!我可以推荐一个正则表达式分析器吗?你可以在下面的线程中找到一个你喜欢的(有几个):第二组参数是不必要的,因为它是一个单字符类。这与
sed'/^\([0-9]\)[0-9]*\1$/,做的事情是一样的!我可以推荐一个正则表达式分析器吗?您可以在以下线程中找到一个您喜欢的(有几个):