正则表达式使用grep函数获取彼此相等的第一位和最后一位

时间:2019-10-21 23:33:16

标签: regex grep

我试图找到夹在数字汤中相同数字之间的单词。它们可以在其他地方被数字打断,但它们必须以相同的数字开头和结尾。例如:

936694753355715720418156005497888680833462758860829*9ang0io752901403085mat93a9*535

血管瘤夹在两个9s之间。

936694753355715720418156005497888680833462758860829*9ang0io752901403085mat93a7*535

在上述情况下,它是不正确的,因为它以9开头但以7结尾。

这是一个.txt文件,不包含任何空格。每行的长度相同,只包含小写字母和数字。我在第一个和最后一个数字之间得到字母和数字,但是不知道如何取彼此相等的第一个和最后一个数字。谢谢你提前做好一切。

到目前为止我得到了什么:

$ 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 个答案:

答案 0 :(得分:1)

仅允许从行开头到第一个[a-z]之间的数字。我会使用grep -oP之类的

^\d*\K(\d)[a-z](?>\d*[a-z]+)*\1
  • ^行的开头\d*,任意数量的数字和\K resets比赛的开始
  • capture在组1的第一个(\d)之前的一个[a-z]一个(?>\d*[a-z]+)*
  • 跟随\1任意数量的atomic group,直到满足captured armeabi-v7a

See this demo at regex101

答案 1 :(得分:0)

这是您想要做的:

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

输出: (来自您的示例)

1ac31069383748462343642622383007520ou280685412598707stical1

选项:

-o, --only-matching     仅打印匹配行的匹配(非空)部分,每个这样的部分都在单独的输出行上。 。 -P, --perl-regexp     将模式解释为与Perl兼容的正则表达式(PCRE)。这是高度试验性的,grep -P可能会警告未实现的功能。

正则表达式:

^           # 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