Regex для получения первой и последней цифры, которые равны друг другу с помощью функции grep - PullRequest
1 голос
/ 22 октября 2019

Я пытаюсь найти слова, которые зажаты между одной цифрой в супе из цифр. Они могут быть прерваны цифрами в других местах, но они должны начинаться и заканчиваться одной и той же цифрой. Например:

936694753355715720418156005497888680833462758860829*9ang0io752901403085mat93a9*535

angiomata находится между двумя 9 с.

936694753355715720418156005497888680833462758860829*9ang0io752901403085mat93a7*535

В приведенном выше случае это было бы неправильно, поскольку оно начинается с 9, но заканчивается 7.

Это текстовый файл, не содержащий пробелов. Каждая строка имеет одинаковую длину и включает только строчные буквы и цифры. Я получил буквы и цифры между первым и последним числом, но не знаю, как взять первое и последнее число, которые равны друг другу. Спасибо за все заранее.

что я получил до сих пор:

$ egrep "[[:digit:]]{1}[a-z]+(.*)[a-z][[:digit:]]{1}" .txt

Несколько строк из файла: (9-я строка содержит то, что я ищу - 1ac31069383748462343642622383007520ou280685412598707stical1 - 1acoustical1)

8659143296aconite931031567290592196372720165714862606068549452875678894011583394 429537968991065280440972955773783975aconite405304426503915937177910674938356s995 165730080656179172282158326723459395151887a197343544312497429322conitic971943257 242700348160683825750220278124532230615414861aconi0423t2209041629um7534201414279 8095795129421424035773aconit51122048059352421754855393594um083s57745637407177073 203520740229811376acor4730n05675830009456231936341628077162200687753246324478764 0047610666820884722216474722512324028387365649588049630aco5307rns847715766988588 568901339322354170088854729578680996027154709227496061907093046a199546373coustic 293915167531ac31069383748462343642622383007520ou280685412598707stical13002190096 83982473352438654261757963864323333acou021534520556605043806stical2223ly16922171 02309730655acousti3490661184937075557973850179cia014890505513865828185722n085724 26480962052acousti87311144532313023833020698187076874569358847788485c8205ians518 24711482467426173614aco00496247639921262483584020ustic92007815150348941694311s0 8

Ответы [ 2 ]

1 голос
/ 22 октября 2019

Разрешить только цифры от начала строки до первого [a-z]. Я бы использовал grep -oP с чем-то вроде

^\d*\K(\d)[a-z](?>\d*[a-z]+)*\1

См. Эту демонстрацию на regex101

0 голосов
/ 22 октября 2019

Это делает то, что вы хотите:

grep -oP '^\d*\K(\d)[a-z]\w+[a-z]\1' file.txt

Вывод: (из вашего примера)

1ac31069383748462343642622383007520ou280685412598707stical1

Опции:

. -o, --only-matching Печать только совпадающих (непустых) частей совпадающей строки, каждая из которых находится на отдельной выходной строке. ,-P, --perl-regexp Интерпретировать шаблон как Perl-совместимое регулярное выражение (PCRE). Это очень экспериментально, и grep -P может предупредить о невыполненных функциях.

Regex:

^           # beginning of line
  \d*       # 0 or more digits
  \K        # forget all we have seen until this position
  (\d)      # group 1, 1 digit
  [a-z]     # a letter
  \w+       # 1 or more word character, you may use [a-z0-9]+
  [a-z]     # a letter
  \1        # same digit as in group 1

Или однострочник Perl:

$perl -ane 'if(s/^\d*\K(\d)[a-z]\w+[a-z]\1/$&/){s/\d+//g;print "line: $.: $_"}' file.txt
line: 9: acoustical
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...