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

时间:2011-12-07 14:00:24

标签: bash sed

此代码输出只有第一个和最后一个数字相同的行 - 有人可以用英语解释这是如何工作的:

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

输出:

11
22
33 etc

我知道它会在开始时查找一个数字^,然后是另一个数字,但我不清楚它如何与\1$一起得到答案?

4 个答案:

答案 0 :(得分:3)

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

([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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

首先匹配行的开头,然后括号是一个组(可以在后面引用),即一个数字0-9。该小组之后是另一组,也有一位数,该组可重复0次以上。之后会有对第一组(\ 1)的引用,最后是对行尾的匹配。

所以,基本上它只是说最后一位数字必须与第一位数字相同,并且它们之间可以有任意数字位数。

不需要对中间数字进行分组,因为它们未被引用,因此可以将其重写为

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

如果您希望最后一位数字与第一位数字相同而第二位数字与第二位数字相同,那么您将匹配 1221,245642 2424 < / em>然后你可以使用

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

尝试使用 seq 100000