使用 grep 通过正则表达式查找对分组在一起的所有行

使用 grep 通过正则表达式查找对分组在一起的所有行

因此,文档包含以下形式的字符串:

9s5s4sKs7h6h4h2d4dAdTd2c3c
6hKhQs6s3s7s5d3d2d9dKdAd4h
5s9sTs8hKhJc4s6c4hJsAc2dKs

每行都由数字/大写字母和小写字母对组成。

我想查找所有具有相同小写字母的对分组(彼此相邻)的所有行(例如 Ks 或 2d)。因此,在第一行,带有“s”的对都彼此相邻,然后是“h”对,然后是“d”,然后是“c”。

只有 4 个可能的小写字母(s、c、d、h),因此我编写了以下正则表达式:

^.(.)(.\1)*.(.)(.\3)*.(.)(.\5)*.(.)(.\7)* .*$

但这并不能解释这样的行:

6hKhQs6s3s7s5d3d2d9dKdAd4h

其中开头有一些“h”对,然后是其他一些对,最后有一对“h”。所以这条线不应该匹配。

我为此使用 grep 命令。

例子:

grep -P "^.(.)(.\1)*.(.)(.\3)*.(.)(.\5)*.(.)(.\7)* .*$" file.txt

输入:

9s5s4sKs7h6h4h2d4dAdTd2c3c 
6hKhQs6s3s7s5d3d2d9dKdAd4h
5s9sTs8hKhJc4s6c4hJsAc2dKs

输出:

9s5s4sKs7h6h4h2d4dAdTd2c3c

在这条线上,我们首先有与“s”的对,然后是与“h”的对,然后是与“d”的对,最后是与“c”的对。

该行6hKhQs6s3s7s5d3d2d9dKdAd4h不匹配,因为开头有一组“h”对,然后是其他一些对,最后又是一个“h”对。这意味着它们没有组合在一起并且该行不应该匹配。

答案1

由于字母仅限于scdh,您可以使用以下方法过滤掉在两次出现相同字母时具有不同字母的行:

grep -ve 's.*[cdh].*s' -e 'c.*[sdh].*c' -e 'd.*[sch].*d' -e 'h.*[scd].*h'

或者使用类似 perl 的正则表达式(如果可用):

grep -Pv '([scdh]).*(?!\1)[scdh].*\1'

在这里,您可以使用[a-z]代替[scdh]任何 ASCII 小写字母。或者[[:lower:]]\p{Ll}代表任何字母表中的任何小写字母。

相关内容