从文件中删除连续四个或多个相同字符的行

时间:2018-07-27 20:24:42

标签: linux bash text automation

我希望标题足以说明我需要的帮助,但我会更详细地说明。

我有一个文本文件,每行包含7个字符长的字符串。字符串如下所示:

aaaaaad
aaabbbd
AAaa123
AkLmbB3

此文件包含这7个字符长的字符串中的数十万个,我需要删除任何包含太多按顺序排列的相同字符的行。例如:

aaaaLu1 <-- Remove this, because there is 4 `a` characters next to each other.

aaBaa1b <-- Keep this line

bbbb1Lk <-- Remove this line, because there is 4 `b` characters next to each other.

bababab <-- Keep this line, as the `b` characters aren't next to each other, even though there is 4 of them.

是否可以通过GNU + Linux命令行执行此操作?也许使用grep或sed的正则表达式?我在Internet上四处寻找grep正则表达式,但是它们通常只检查一行中有多少个相同字符,而不检查它们是否按顺序排列。如果有什么比使用正则表达式(可以自动运行并可以从基于Linux的发行版运行)更有效的方法,我愿意接受这样的建议。

我目前正在使用Manjaro Linux。

谢谢!

2 个答案:

答案 0 :(得分:1)

获取任何字符(.),对其进行回引用\1,然后查看是否再出现3次{3}。例如,使用ag,它使用perl regex:

ag -sv '(.)\1{3}'

答案 1 :(得分:1)

使用gnu sed可以使用以下命令:

sed -E '/([[:alnum:]])\1{3}/d' file

aaBaa1b
bababab

其中file是:

cat file

aaaaLu1
aaBaa1b
bbbb1Lk
bababab

要将内联的更改保存到同一文件中,请使用:

sed -i -E '/([[:alnum:]])\1{3}/d' file

详细信息:

  • ([[:alnum:]]):匹配任何字母数字并将其捕获到第一个捕获组中
  • \1{3}\1是第一个捕获组的后向引用,{3}匹配了3次相同的捕获

  • /d:删除这些行