объяснить часть выражения sed - * \ 1 $ / p - PullRequest
0 голосов
/ 07 декабря 2011

Этот код выводит строки, в которых совпадают только первая и последняя цифры - может ли кто-нибудь объяснить на английском, как это работает:

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

выходы:

11
22
33 etc

Я знаю, он ищет номер в начале ^, а затем другой номер, но мне неясно, как это работает с \1$, чтобы получить ответ?

Ответы [ 4 ]

3 голосов
/ 07 декабря 2011

На самом деле это соответствует любой цифре:

([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 голос
/ 07 декабря 2011

Он начинается с совпадения начала строки, затем в скобках указывается группа (на которую можно ссылаться позже), состоящая из одной цифры 0-9.За группой следует другая группа, также с одной цифрой, и эта группа может повторяться 0 или более раз.После этого есть ссылка на первую группу (\ 1) и, наконец, совпадение для конца строки.

Итак, в основном это просто говорит, что последняя цифра должна совпадать с первой цифрой, и может быть любое числоцифр между ними.

Нет необходимости группировать средние цифры, поскольку на них нет ссылок, поэтому их можно переписать следующим образом:

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

Если вы хотите, чтобы последняя цифра былато же самое, что первая цифра, а вторая до последней - то же, что и вторая, поэтому вы должны соответствовать 1221,245642 , но не 2424 , тогда вы можете использовать

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

Попробуйте это с seq 100000

1 голос
/ 07 декабря 2011

\1 - «первый соответствующий термин». $ - это «конец строки».

То есть \1$ означает «совпадает с тем же термином (т. Е. Цифра 0-9), найденным в начале строки снова в конце строки.

1 голос
/ 07 декабря 2011

В начале ищется число, за которым следуют ноль или более чисел (обратите внимание на звездочку после второй круглой скобки), и, наконец, проверка на \1 в конце - которая представляет собой то же самоезначение как в первой скобке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...